《MySQL技術內幕六》-備份和恢復

《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 小杭

這個章節的內容,感覺寫的不好啊,我想要的是理論並且加上具體操作的。

需要再找具體研究備份的書來系統學習 (ノ`Д)ノ


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章