《MySQL技術內幕-InnoDB存儲引擎》-備份和恢復
2019-07-29 ε=(´ο`*)))唉
簡單的說說:啥主從備份,冷備,熱備,增量備份,日誌備份。。。。等等的東東。。。。。
常用工具:mysqldump、ibbackup、replication、xtrabacup、LVM快照備份。。。。
邏輯備份
邏輯備份導出
使用mysqldump【重點】
使用的是**mysqldump 這個工具,導出的是sql文件。可讀的。
直接看使用的栗子,再說參數:
# 特定表的條件導出
mysqldump -uroot -proot --databases db1 --tables a1 --where='id=1' >/tmp/a1.sql
# 運維使用的語句
mysqldump --single-transaction --master-data=2 --skip-add-locks -u賬戶 -p'密碼' -h 主機 數據庫 >/var/lib/mysql/***.sql
# 我瞎寫的[沒試過的╮(╯_╰)╭]
mysqldump -uroot -p'123456' --host=localhost --single-transaction --master-data=2 --skip-add-locks --databases db1 >/var/lib/mysql/***.sql
參數說明:
- -u[…] -p[…] -h[…]: 使用的用戶名密碼和遠程數據庫地址
- –databases db1 :指定數據庫(指定數據庫db1)
- –tables a1 :指定表
- –where=‘id=1’ :條件導出的條件
- –single-transaction :【必須項】獲得備份一致性的參數,邏輯爲開啓一個長事務來導出數據,只對InnoDB有效。【但是不隔離DDL操作】
- –master-data=2 : 用於控制備份文件,是否有數據庫的主庫的信息點(CHANGE MASTER。。。。)。爲1時,導出主庫信息,爲2時,此語句被註釋掉。【用途就是在配置主從的時候要不要手動配置主庫的文件名和位置】【建議是使用手動進行配置:2】【我覺得這裏要是1,正式使用如果不停掉業務,不好指定備份點的,看最後主從備份】
- –skip-add-locks : (取消LOCK語句) 取消對錶的鎖定,應該是爲了避免影響正常業務
- 參數還有好多。。。略過了。。。
使用 into outfile
使用的是 select ... into outfile
的,常用於單表導出:
select * into outfile '/home/bak/test_bak.text' from text;
-- 參數用於特定字符裝換 [字段分隔符]【行分割符windows換行符是“\r\n”的問題】
select * into outfile '/home/bak/test_bak.text' fields terminated by ',' lines terminated by '\r\n' from text;
這一種瞭解一下就可以了,單表的通常很少會使用的。
邏輯備份恢復
作爲邏輯備份出來的文件,通常就是SQL語句,所以是可以直接執行就好了:
[root@mysql ~]# mysql -uroot -p <test_back.sql
-- 或者作爲資源導入
mysql> source /home/bak/test_back.sql;
mysqldump的導出,是包括存儲過程,觸發器,導出事件,導出數據,但是是沒有視圖的,這個要另外操作的。
load data infile 導入
對於以上邏輯備份導出的文件,邏輯SQL命令的,可以用這個來導入。
-- 這個命令的參數與前邊into outfile一樣的(尤其對字符的轉換)
load data into table a ignore 1 lines infile '/home/bak/test_back.sql';
-- ignore n lines:忽略導入前幾行
mysqlimport 導入
命令內部也是調用 load data infile 的,所以參數 也是一樣的。只是這個可併發導入多個文件。
mysqlimport --use-threads=2 db1 /home/bak/test_back.sql /home/bak/test_back_2.sql
邏輯備份的備份導出和導入,就這些了 。。。
二進制日誌相關的備份
這本書關於這個的內容相當的簡略,根本無法操作的,需要自己查資料纔行。(ノ`Д)ノ
就是所謂的binlog的備份,常用於增量備份,數據庫複製,主從同步的。
默認是不開啓的,所以需要配置文件中進行配置:
log-bin = mysql-bin
sync_binlog = 1
innodb_support_xa = 1
簡單的binlog的備份,使用的就是mysqlbinglog 命令,很簡單,略過了。【因爲只能在很簡單的場景下使用】
熱備 Xtrabackup 工具
這是一個開源的,牛X的熱備工具。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
官方文檔地址:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
這個工具,功能好像很多,這裏就簡單介紹一點點,其他的看官方的文檔了,全量,增量備份啥的文檔都有的。
安裝
直接用官方的栗子:[CentOS / Amazon Linux AMI]
#爲了成功安裝Percona XtraBackup libev包需要先安裝。libev包可以從EPEL存儲庫安裝 。
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
#安裝
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum list | grep percona
yum install percona-xtrabackup-24
#安裝完畢後檢測
innobackupex --help
常用參數
--defaults-file #指定MySQL配置文件 ,如果不指定–defaults-file,默認值爲/etc/my.cnf
--user=root #備份操作用戶名,一般都是root用戶
/mnt/backup/ #備份路徑
--socket=/tmp/mysql.sock #指定mysql.sock登錄(可通過innobackupex --help查看)
--parallel=2 --throttle=200 #並行個數,根據主機配置選擇合適的,默認是1個,多個可以加快備份速度。
2>/mnt/backup/bak.log #備份日誌,將備份過程中的輸出信息重定向到bak.log
--apply-log #在備份目錄下生成一個xtrabackup_logfile事務日誌文件, 此外,創建新的事務日誌。 InnoDB配置從文件“backup-my.cnf”中讀取。
--redo-only #全備數據後對DB有增量更改,則必須執行此操作,在準備基本完全備份和合併除最後一個之外的所有增量備份時,應使用此選項
全量備份恢復
全量備份的栗子:
[root@szq ~]# /usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel=2 --throttle=200 /data/db_backup/xtrabackup --socket=/tmp/mysql.sock
#執行命令後輸出:
xtrabackup: recognized server arguments:
xtrabackup: recognized client arguments:
180726 15:00:18 innobackupex: Starting the backup operation
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
180726 15:00:28 All tables unlocked
180726 15:00:28 Backup created in directory '/data/db_backup/xtrabackup/2018-03-28_17-33-41/'
MySQL binlog position: filename 'master-bin.000008', position '191', GTID of the last change '5be531c0-3252-11e8-a5a9-000c2923f205:1-1079'
180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/backup-my.cnf
180726 15:00:28 [00] ...done
180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/xtrabackup_info
180726 15:00:28 [00] ...done
xtrabackup: Transaction log of lsn (1090604498) to (1090604498) was copied.
180726 15:00:29 completed OK!
以上可以看到整個備份過程,說明備份成功!
全量恢復的栗子:
# 在空的數據庫下,data/mysql/ /data/mysql_bak/ 這兩個目錄下都是空的
[root@szq db_backup]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/全備份文件夾/
增量備份
增量備份,需要在一次全備份之上繼續操作的。
第一次增量備份:
一、以全備目錄爲基礎做增量備份
--incremental 指定增量備份1的目錄
--incremental-basedir=指定全量備份的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/xtrabackup/全備份文件夾/ --parallel=2 --throttle=200 backup_type = incrementa
第二次增量備份:
二、增量備份1次之後,再次增量備份2的話,需要在增量備份1目錄的基礎上做增量備份2
--incremental 指定增量備份2的目錄 (增量備份1和增量備份2的目錄在同一父目錄下)
--incremental-basedir=指定增量備份1的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/incremental/增量1份文件夾/ --parallel=2 --throttle=200
增量備份 恢復
增量恢復全過程:
############兩個備份做整合########################################
以增備1爲基礎做增備2,數據如何恢復?
先全量備份數據+增量備份1數據合併,然後全量備份數據+增量備份2數據合併,數據最終合併到全量備份目錄內:
--incremental-dir= 先指定增量備份1的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/全備份文件夾/ --incremental-dir=/data/db_backup/incremental/增量1份文件夾/
--incremental-dir= 先指定增量備份2的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/全備份文件夾/ --incremental-dir=/data/db_backup/incremental/增量2份文件夾/
######################################################################
2.1、準備增量備份2:在全備的基礎上增備,已全備目錄爲基礎做增備2:
備註:每次的增量備份,都可以以全量備份爲基礎做增量備份1、2、3、4 ~~~~
--incremental 指定增量備份2的目錄
--incremental-basedir=指定全備的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir=/data/db_backup/xtrabackup/全備份文件夾/ --parallel=2 --throttle=200 backup_type = incrementa
######################################################################
備份完畢後,可以通過檢查文件的LSN號,來確認增量備份文件的一致性:xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1732070
last_lsn = 1732070
compact = 0
recover_binlog_info = 0
######################################################################
優點:數據恢復的時候,直接全備數據+最後一次增量備份n做數據合併,而不是[全量備份數據+增量備份1數據+增量備份2數據合併]
######################################################################
三、在全備目錄上重放已提交的事務:
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/全備目錄/
四、全量備份數據+增量備份2數據合併,數據最終合併到全量備份目錄內:
--incremental-dir= 指定增量備份2的目錄
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/全備目錄/ --incremental-dir=/data/db_backup/incremental/定增量備份2/
五、在全備目錄(增量數據+全備數據合併) 開始回滾未提交的事務:
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/全備目錄/
#####################################################################################
六、恢復全備數據(全備+增備合併後的數據)
#關閉數據庫
/usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
#移除數據目錄
mv /data/mysql/ /data/mysql_bak/
#重新創建MySQL數據目錄
mkdir -p /data/mysql/
#將全備數據(全備+增備)恢復到MySQL
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/全備目錄/
#授權
chown -R mysql.mysql /data/mysql
#啓動MySQL
/usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1
這裏的增量備份之後,需要與全備份進行合併,之後每一次的備份都合併到全備份,保證全備份的完整性,最後恢復的時候就是把整個全備份恢復回去就可以了。【這個感覺還是要用腳本來執行纔行,收工處理比較不現實】
這裏的參考文章爲:https://blog.csdn.net/sinat_29214327/article/details/81517233
後續還有使用Xtrabackup來做主從數據庫複製的,但是,mysql本身就可以做這個的,不需要第三方的了。
主從複製
(╯‵□′)╯︵┻━┻ 這書,沒有說具體的怎麼實現的。。。。。(ノ`Д)ノ
主從複製的流程:
- 主服務器[master]吧數據記錄到binlog中
- 從服務[slaave]獲取主服務的binlog到自己的中繼日誌中【relay log】
- 從服務器重做中繼日誌中的日誌,把應用到數據庫上。
然後就這樣了,之後書的內容,就balabala的各種狀態了,都沒說怎麼搭建(ノ`Д)ノ
主從複製具體操作
主從複製做主備數據庫,Mysql本身就是支持的,改改配置,一個命令就可以了。:
1.主數據庫配置:my.cnf
//主要就是開啓binlog 就可以了
binlog_format = MIXED //binlog日誌格式,mysql默認採用statement,建議使用mixed
log-bin = /data/mysql/mysql-bin.log //binlog日誌文件
expire_logs_days = 7 //binlog過期清理時間
server-id = 101
binlog_do_db = test
//以下只是binlog的優化配置了 具體依據服務器性能調整
max_binlog_size = 100m //binlog每個日誌文件大小
binlog_cache_size = 4m //binlog緩存大小
max_binlog_cache_size = 512m //最大binlog緩存大小
#每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去
innodb_flush_log_at_trx_commit=1
binlog_do_db :指定記錄二進制日誌的數據庫,即需要複製的數據庫名,如果複製多個數據庫,重複設置這個選項即可。
binlog_ignore_db :指定不記錄二進制日誌的數據庫,即不需要複製的數據庫名,如果有多個數據庫,重複設置這個選項即可。
其中需要注意的是,binlog_do_db和binlog_ignore_db爲互斥選項,一般只需要一個即可。
2.創建從庫
這裏的創建,是需要從主庫全備份一個出來的。可以使用前邊的mysqldump邏輯備份,也可以是Xtrabackup熱備份。
在mysqldump中的–master-data 參數,如果是1,則在時候的連接主庫的時候無需自定檢查點,若爲2,則需要手動配置同步binlog的文件和檢查點。
Xtrabackup備份出來的,檢查點信息是在備份目錄下xtrabackup_checkpoints中。
創建,與主庫一樣版本的數據庫,並恢復主庫的全備份。
3.從數據庫配置:my.cnf
server-id=100
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
relay-log : 啓動MySQL二進制日誌,可以用來做數據備份和崩潰恢復,或主服務器掛掉了,將此從服務器作爲其他從服務器的主服務器
replicate-do-db :指定同步的數據庫,如果複製多個數據庫,重複設置這個選項即可。若在master端不指定binlog-do-db:則在slave端可用replication-do-db來過濾。
replicate-ignore-db :不需要同步的數據庫,如果有多個數據庫,重複設置這個選項即可。
【其中需要注意的是,replicate-do-db和replicate-ignore-db爲互斥選項,一般只需要一個即可。】
4.連接主數據庫
在重啓MySQL服務之後,就可以開始連接主數據庫進行數據同步了。
在從數據庫:
#進入mysql數據庫
mysql -uroot -p
#連接master主服務器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#備註:
#master_host對應主服務器的IP地址。
#master_port對應主服務器的端口。
#master_log_file對應show master status顯示的File列:master-bin.000001。
#master_log_pos對應show master status顯示的Position列:154。
這裏的master_log_file和master_log_pos 參數,如果是全備份–master-data = 1 的時候是不需要的,因爲在binlog中已經有的(而且沒有被註釋掉)。
雖然不知道爲什麼,查到的這裏推薦使用的參數爲2,╮(╯_╰)╭ 我覺得自動的挺好的呀
5.啓動slave數據同步
#啓動slave數據同步
mysql> start slave;
#停止slave數據同步(若有需要)
mysql> stop slave;
其他命令
會用到的一些其他命令:
--查看主庫狀態
show master status;
--查看從庫狀態
show slave status
到這裏,就算是配置完成了,至於多備庫同步的情況,,,(⊙o⊙)… 不會 ╮(╯_╰)╭
其他
關於mysql.sock
在上面的的代碼裏面,比較的經常出現mysql.sock
這個東東,而這個的作用就是連接數據庫。
對mysql.sock來說,其作用是程序與mysqlserver處於同一臺機器,發起本地連接時可用。並且這東東是啥端口ip都不用指定的。
-- 比如:
mysql -uroot -S /data/3309/mysql.sock < /server/backup/mysql_2016-07-07.sql
-- 這個SQL 就是直接執行了sql 文件了
這個就是服務本機,連接數據庫服務的一個內部工具,恩 ,就這麼理解就可以了。
小結一下
這篇主要就是主從數據同步的,結果書上還完全沒有操作(ノ`Д)ノ,只能自己查了。。。。
除了主從複製之外,就是mysqldump,Xtrabackup
這兩個備份工具的介紹和使用了。其他的就沒有了。
而關於主從複製之後的讀寫分離,是可以通過程序進行處理的,或者使用mycat來實現(我不會)。【再或者直接在MySQL用戶權限上只給讀權限】
2019-07-30 小杭
這個章節的內容,感覺寫的不好啊,我想要的是理論並且加上具體操作的。
需要再找具體研究備份的書來系統學習 (ノ`Д)ノ