Docker下Mysql8數(shù)據(jù)備份與恢復(fù)實現(xiàn)
1 創(chuàng)建Mysql容器
- 格式
docker run -d --name=容器名稱 -p 宿主端口號:3306 -e MYSQL_ROOT_PASSWORD=mysql密碼 -e MYSQL_PASSWORD=mysql密碼 -e TZ=Asia/Shanghai -v 宿主目錄-數(shù)據(jù):/var/lib/mysql -v 宿主目錄-備份數(shù)據(jù):/backup --restart always mysql:版本號
- 示例
docker run -d --name=mysql-8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_PASSWORD=123456 -e TZ=Asia/Shanghai -v /workspace/mysql-8:/var/lib/mysql -v /workspace/mysql-8-backup:/backup --restart always mysql:8.0
2 連接Mysql
- Navicat

- 創(chuàng)建SQL
-- 刪除數(shù)據(jù)庫 DROP DATABASE IF EXISTS `test`; -- 創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE IF NOT EXISTS `test`; -- 進(jìn)入數(shù)據(jù)庫 use `test`; -- 創(chuàng)建表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -- 插入數(shù)據(jù) INSERT INTO `student` (`id`, `name`,`age`) VALUES (1, '小紅', '20'); INSERT INTO `student` (`id`, `name`,`age`) VALUES (2, '小明', '21');
3 Binlog檢查
3.1 檢查是否開啟
SHOW VARIABLES like 'log_bin';
- ON : 開啟
- OFF : 關(guān)閉
3.2 mysql 5.7
- 找到
my.cnf
find / -name my.cnf
- docker 位置:
/etc/my.cnf - 開啟
[mysqld] log_bin = mysql-bin server_id = 1 # 設(shè)置MySQL實例的唯一ID,如果有多個MySQL實例,每個實例的ID必須不同
3.3 mysql8
- 默認(rèn)開啟
4 備份數(shù)據(jù)庫
4.1 容器里執(zhí)行備份
- 進(jìn)入容器
docker exec -ti mysql-8 /bin/bash
- 在容器內(nèi)創(chuàng)建備份目錄
- 前面創(chuàng)建容器時已創(chuàng)建,沒有則執(zhí)行下面
mkdir /backup
- 全量備份SQL
mysqldump --single-transaction --flush-logs --source-data=2 --routines --opt -uroot -p123456 test > /backup/test_20240713.sql
4.2 宿主機(jī)執(zhí)行備份
- 格式
docker exec 容器名 bash -c '命令1 && 命令2'
- 示例
docker exec mysql-8 bash -c 'mysqldump --single-transaction --flush-logs --source-data=2 --routines --opt -uroot -p123456 test > /backup/test_20240713.sql'
4.3 參數(shù)說明
mysqldump: 這是 mysqldump 命令的執(zhí)行路徑或者別名,用于備份 MySQL 數(shù)據(jù)庫。--single-transaction: 在導(dǎo)出數(shù)據(jù)時使用單個事務(wù),這樣可以確保導(dǎo)出的數(shù)據(jù)是一個一致性狀態(tài)的快照,避免了在備份過程中數(shù)據(jù)變化引起的問題。--flush-logs: 在備份完成后刷新日志文件,這樣可以確保備份包含了最新的日志記錄。--source-data=2: 指定數(shù)據(jù)來源的格式,這里是指定為默認(rèn)格式 2,表示在備份過程中,將主服務(wù)器的二進(jìn)制日志位置信息也備份到文件中。這個參數(shù)比較重要,用于在恢復(fù)數(shù)據(jù)時找到位置信息。- Mysql 8 :
--source-data=2 - Mysql 5.7 :
--master-data=2
- Mysql 8 :
--routines: 備份存儲過程和函數(shù)。--opt: 表示使用優(yōu)化過的備份方式,以提高備份速度和減少備份文件的大小。-uroot: 使用 root 用戶連接到 MySQL 數(shù)據(jù)庫。-p: 提示輸入密碼。test: 要備份的數(shù)據(jù)庫名稱,這里假設(shè)要備份的數(shù)據(jù)庫名為 test。> backup.sql: 將導(dǎo)出的 SQL 數(shù)據(jù)寫入到 backup.sql 文件中。
5 定時備份
使用crontab定時任務(wù)來實現(xiàn)定時備份功能
- 新建個shell腳本
mysql-backup.sh
#!/bin/bash docker exec mysql-8 sh -c 'mysqldump --single-transaction --flush-logs --source-data=2 --routines --opt -uroot -pn2wqeGrlv7 test > /backup/test_$(date +%Y%m%d_%H%M%S).sql'
- 進(jìn)入crontab
crontab -e
- 添加到定時任務(wù)
- 每1分鐘生效
# mysql備份-每1分鐘 */1 * * * * /workspace/cron-jobs/mysql-backup.sh >> /workspace/cron-jobs/mysql-backup.log 2>&1
- 每天凌晨3點生效
mysql備份-每天凌晨3點 0 3 * * * /workspace/cron-jobs/mysql-backup.sh >> /workspace/cron-jobs/mysql-backup.log 2>&1
- 保存即時生效
# 按 shift + : # 輸入 wq
6 恢復(fù)數(shù)據(jù)
容器內(nèi)
格式:
mysql -uroot -p密碼 數(shù)據(jù)庫 < 備份數(shù)據(jù)庫SQL文件路徑
mysql -uroot -p123456 test < /backup/test_20240714_123905.sql
宿主機(jī)
格式:
docker exec -i 容器名 mysql -uroot -p密碼 數(shù)據(jù)庫 < 備份數(shù)據(jù)庫SQL文件路徑
docker exec -i mysql-8 mysql -uroot -p123456 test < /workspace/mysql-8-backup/test_20240714_123905.sql
7 注意事項
7.1 定時備份,出現(xiàn)the input device is not a TTY
- 原因:
? "the input device is not a TTY" 錯誤通常出現(xiàn)在嘗試從非交互式的上下文(比如 cron 任務(wù))中運行需要交互的命令時。
在你的情況下,可能是你的 Shell 腳本 mysql-backup.sh 中包含了需要交互的部分,但是在 cron 任務(wù)中無法提供所需的交互。
- 解決方案:
將腳本中 docker exec -it 中去掉 -it 即可,表示在容器外部執(zhí)行命令,而不需要進(jìn)入容器內(nèi)開啟交互終端。
7.2 提示
mysqldump: [Warning] Using a password on the command line interface can be insecure.
原因:
命令行不能出現(xiàn)密碼 -p123456
臨時解決方案
- 設(shè)置環(huán)境密碼,然后命令行不在輸入密碼
- 設(shè)置環(huán)境密碼
export MYSQL_PWD='123456'
- 去掉密碼命令行
-p密碼
docker exec mysql-8 bash -c 'mysqldump --single-transaction --flush-logs --source-data=2 --routines --opt -uroot test > /backup/test_20240713.sql'
? export MYSQL_PWD='123456' 是臨時性的設(shè)置,適合用于測試、臨時任務(wù)或者當(dāng)前會話中的需要。
如果你需要更持久的設(shè)置,考慮 使用 Dockerfile、Docker Compose 文件或者其他更長久的配置方式來設(shè)置環(huán)境變量
長期解決方案:
- 創(chuàng)建容器時候加入
-e MYSQL_PASSWORD=密碼
docker run --name=mysql-8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_PASSWORD=123456 --restart always -v /workspace/mysql-8:/var/lib/mysql -v /workspace/mysql-8-backup:/backup -d mysql:8.0
- 去掉密碼命令行
-p密碼
docker exec mysql-8 bash -c 'mysqldump --single-transaction --flush-logs --source-data=2 --routines --opt -uroot test > /backup/test_20240713.sql'
?總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker使用Calico網(wǎng)絡(luò)模式配置及問題處理方法
這篇文章主要介紹了Docker使用Calico網(wǎng)絡(luò)模式配置及問題處理,設(shè)計思想是Calico不使用隧道或者NAT來實現(xiàn)轉(zhuǎn)發(fā),而是巧妙的把所有二三層流量轉(zhuǎn)換成三層流量,并通過host上路由配置完成跨host轉(zhuǎn)發(fā),需要的朋友可以參考下2022-11-11
Docker Registry倉庫加密傳輸與登錄認(rèn)證方式
本文詳細(xì)介紹了如何為Docker私有倉庫配置加密傳輸(TLS)和認(rèn)證功能,包括生成自簽名證書、配置客戶端證書、添加認(rèn)證文件和測試倉庫功能2025-12-12

