1. 程式人生 > 程式設計 >mysqldump基於docker容器實現資料庫備份與恢復

mysqldump基於docker容器實現資料庫備份與恢復

資料備份與還原

mysqldump基於docker容器實現資料庫備份與恢復

環境描述:
mydb 源資料庫容器
myddb2 新資料庫容器
複製程式碼
建立源資料庫容器
docker run --name mydb -p 3333:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mydb/data:/var/lib/mysql -v /data/mydb/conf/my.cnf:/etc/my.cnf  --privileged=true -d mariadb
複製程式碼
建立新資料庫容器
docker run --name mydb -p 3334:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mydb2/data:/var/lib/mysql -v /data/mydb2/conf/my.cnf:/etc/my.cnf  --privileged=true
-d mariadb 複製程式碼
源資料庫中新增資料(現實環境不需要)
docker cp hellodb_innodb.sql mydb:/  	#hellodb_innodb.sql 一個sql語句檔案
複製程式碼
進入源資料庫
docker exec -it mydb bash
mysql -uroot -p< hellodb_innodb.sql	#匯入資料
#檢視二進位制日誌狀態
show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON 	|
+---------------+-------+
複製程式碼
備份源庫資料
# mysqldump -uroot -p --all-databases --lock-all-tables --master-data=2 > /all.sql
Enter password: 123

#--lock-all-tables表示鎖表操作,保證備份期間無資料變動
#--master-data=2將備份時的二進位制日誌進行表示為註釋語句新增至all.sql中
複製程式碼
檢視備份開始的二進位制日誌檔案是哪個
因為docker容器中不方便檢視all.sql檔案,所以拷貝all.sql到宿主機環境
~]# pwd
/root
# docker cp mydb:/all.sql .
# less all.sql ...... CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=8960; ...... 複製程式碼
將這些sql操作匯出至增量檔案
# mysqlbinlog --start-position=8960 /var/lib/mysql/mysql-bin.000003 > incre.sql
# 結合二進位制日誌還原到時間點當前這一刻時需要使用
#增量檔案incre.sql複製到宿主機(也可以嘗試mydb容器複製到mydb2容器)
~]# pwd
/root
# docker cp incre.sql mydb2:/	#複製到宿主機,還原資料需要使用
複製程式碼
將源庫修改寫入磁碟
> INSERT INTO students (Name,Age,Gender,ClassID,TeacherID) VALUES('foo',173,'M',3,7);
> flush privileges;
複製程式碼

==========================資料備份完成===================================

資料還原到新資料庫
將備份的.sql檔案拷貝至新資料庫
# docker cp incre.sql mydb2:/
# docker exec -it mydb2 bash
複製程式碼
關閉二進位制日誌
> set sql_bin_log=off;
# session層面關閉二進位制日誌,減少還原操作IO負擔
# 注意mysql使用者需要對all.sql有讀取許可權
複製程式碼
匯入備份的sql檔案
> source /all.sql;  # 此時的資料僅僅為備份點時的資料
複製程式碼
結合二進位制日誌還原到時間點當前這一刻
mysqlbinlog --start-position=8960 /var/lib/mysql/mysql-bin.000003 > incre.sql
複製程式碼

===========================資料還原完成===================================