一、cp
?命令備份
特點:
- 優點:備份恢復數據快:直接復制文件,無需進行數據轉換和復雜的處理,因此備份恢復速度非常快
- 缺點:需要停止數據庫服務,靈活性差,占用空間大,可移植性差
使用:
停止數據庫
創建備份目錄:mkdir -p /usr/local/bin/mysql/data_backup_a
備份:
????????cp -a /usr/local/bin/mysql/data/* /usr/local/bin/mysql/data_backup_a/
恢復:
? ? ? ? 先備份:mv /usr/local/bin/mysql/data/ /usr/local/bin/mysql/data_backup_1
? ? ? ? 再恢復:cp -a /usr/local/bin/mysql/data_backup_a/* /usr/local/bin/mysql/data/
注:保證所有目錄都存在(不存在就創建 mkdir -p )
二、mysqldump全量備份
特點:
優點:備份文件是 SQL 語句,可以直接查看和編輯。支持熱備份,可以對正在運行的數據庫進行備份,而無需停止服務。跨平臺,易恢復,可壓縮
缺點:備份速度較慢:對于大型數據庫,備份過程可能需要較長時間;恢復速度較慢:恢復時需要逐條執行 SQL 語句,速度可能比直接復制文件慢;數據一致性問題: 如果在備份過程中有數據寫入,可能導致備份數據不一致。未壓縮的 SQL 文件可能占用較多存儲空間。備份期間可能影響性能。
使用:
注:可以備份所有庫、單個庫、某張表、壓縮,太多了這里以單個庫為例(如果是docker,為容器中目錄)
備份:
mysqldump -u root -p?--single-transaction --flush-logs --source-data=2 --set-gtid-purged=OFF xiaodu > /usr/local/bin/mysql/backup/database_name_A.sql
參數說明:
--source-data=2
:在備份文件中記錄二進制日志(binlog)的位置信息。這個參數在主從復制環境中非常有用,因為它允許從庫在恢復備份后,從主庫的正確位置開始復制--set-gtid-purged=OFF:GTID(Global Transaction Identifiers)是 MySQL 中用于標識事務的全局唯一標識符。主從復制
--single-transaction
確保備份時不會阻塞事務;--flush-logs
會刷新binlog,生成新的binlog文件,方便后續的增量備份;
定期刷新binlog文件,生成新的binlog文件:mysqladmin flush-logs -u root -p
新的
恢復:
mysql -u root -p xiaodu_A?< /usr/local/bin/mysql/backup/database_name_A.sql
????????
三、mysqlbinlog增量備份
注:mysqlbinlog工具是個問題,Alpine Linux系統沒有mysqlbinlog工具,但是可以使用debian版本的MySQL鏡像文件
MySQL 的二進制日志工具,主要用于解析和處理 MySQL 的二進制日志文件(binlog)。雖然它本身不是直接用于備份的工具,但可以通過結合二進制日志實現增量備份和恢復。
特點:
優點:增量備份: 可以實現基于時間點的增量備份,僅備份自上次備份以來的更改。 節省存儲空間,因為不需要每次都備份整個數據庫。數據完整性: 二進制日志記錄了所有數據更改操作,可以確保數據的完整性和一致性。恢復靈活性: 可以恢復到任意時間點,支持細粒度的恢復操作。支持主從復制: 二進制日志是主從復制的基礎,使用 mysqlbinlog 可以更好地管理復制過程中的數據同步。
缺點:復雜性較高: 需要對二進制日志有較深入的了解,操作相對復雜。依賴二進制日志: 必須啟用二進制日志,并且需要正確配置日志文件的存儲和管理。 備份速度較慢: 二進制日志文件可能較大,解析和備份過程可能需要較長時間。 恢復速度較慢: 恢復時需要逐條應用日志中的更改,速度可能比直接復制文件慢。 對磁盤 I/O 影響大: 在解析和應用日志文件時,可能會對磁盤 I/O 產生較大壓力。
使用:(mysqldump+mysqlbinlog)
Spring Boot 應用數據庫用戶,權限越小越安全。用 root 就像把銀行金庫鑰匙交給前臺。
-- 創建用戶
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!';-- 授予所需權限(示例:只對某個庫有讀寫權限)
GRANT SELECT, INSERT, UPDATE, DELETE ON your_app_db.* TO 'app_user'@'%';-- 刷新權限
FLUSH PRIVILEGES;
mysqlbinlog目錄:/
操作:
場景:8點全量備份,9點修改A表數據,10點修改B表數據,11點整誤刪B表,12:30分才發現;該如何還原數據呢
前提是:你現在手里有一個事故前全量備份過的sql文件
第一步?備份:立即停止寫入 & 保存現場(最好是k)
docker exec my-mysql-8 mysql -uroot -proot -e "SET GLOBAL read_only = 1;FLUSH TABLES WITH READ LOCK;" # 2) 立即全量拷走當前數據和 binlog docker exec mysql-8 cp -a /var/lib/mysql /backup/mysql_$(date +%Y%m%d_%H%M)
查看read_only?是否為1
SHOW GLOBAL VARIABLES LIKE 'read_only';
SELECT @@GLOBAL.read_only;
第二步:MySQL binlog 事件的可讀文本轉儲(也就是將mysql-bin.000004變為讀得懂的事件文本)
找到誤刪事件在 binlog 里的“坐標”
mysqlbinlog --base64-output=decode-rows -v --start-datetime="2025-08-17 10:00:00" --stop-datetime="2025-08-17 10:25:00" /var/lib/mysql/mysql-bin.000004 > /usr/local/bin/mysql/backup/around02.sql
生成“跳過誤刪”的兩段 binlog
# 誤刪之前
mysqlbinlog --start-position=197 --stop-position=3956 --database=xiaodu --base64-output=decode-rows /var/lib/mysql/mysql-bin.000004 | grep -v -E '(^USE `alipay_config`|^DROP TABLE `alipay_config`)' > /usr/local/bin/mysql/backup/part1_before_drop.sql
# 誤刪之后
mysqlbinlog --start-position=4098 --stop-datetime="2025-8-17 10:45:00" --database=xiaodu --base64-output=decode-rows /var/lib/mysql/mysql-bin.000004 | grep -v -E '(^USE `alipay_config`|^DROP TABLE `alipay_config`)' > /usr/local/bin/mysql/backup/part2_after_drop.sql
注意:-E '(^USE `xiaodu`|^DROP TABLE `xiaodu`)' 這個正則排除掉刪除表或者庫的語句,需自行修改;將這段執行的SQL語句是為了不讓刪除語句再次執行(適當選擇是否執行)
# 然后使用 binlog2sql 將事件轉為可執行的SQL語句
首先宿主機上安裝?binlog2sql 工具
也可以下好了再放進來:git clone https://github.com/danfengcao/binlog2sql.git
pip install -r binlog2sql/requirements.txt
可能還需要另外升級:
- 卸載:pip3 uninstall PyMySQL -y
- 安裝:pip3 install PyMySQL==0.9.3
- 安裝:pip3 install --upgrade mysql-replication
- 安裝:pip3 install --upgrade cryptography
- 驗證安裝:python3 -c "from pymysqlreplication import BinLogStreamReader; print('OK')"
最后執行:python3 /usr/local/bin/mysql/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P13306 -uroot -p'root' -d xiaodu -t sys_dict --start-file='mysql-bin.000004' --start-pos=197 --stop-pos=3956 > /usr/local/bin/mysql/backup/restore_sys_dict.sql
# 還原:
mysql -h127.0.0.1 -P13306 -uroot -p'root' < /usr/local/bin/mysql/backup/restore_sys_dict.sql
mysql -u root -p xiaodu < /usr/local/bin/mysql/backup/restore_sys_dict.sql
mysql -h127.0.0.1 -P13306 -uroot -p'root' xiaodu -v -v -v < /usr/local/bin/mysql/backup/restore_sys_dict.sql 2>&1 | tee /usr/local/bin/mysql/backup/restore.log
-v -v -v
:讓 MySQL 把每一條語句都回顯出來。2>&1
:把錯誤信息也合并到標準輸出。tee restore.log
:同時在屏幕和日志文件里保留一份。
復制bin文件:mysqlbinlog /var/lib/mysql/mysql-bin.000001 > /usr/local/bin/mysql/backup/mysql-bin.000001.sql
# 新建一個mysql容器,以免誤刪或者對現場數據的再次污染(過程略過)
# 選1、恢復:重放原始 binlog(最簡單,會把所有事件重放)
mysqlbinlog --start-position=197 --stop-position=3956 /var/lib/mysql/mysql-bin.000004 | mysql -u root -p xiaodu
優點:一條命令搞定。
缺點:會把 197–3956 之間 所有庫、所有表 的操作都重放,不會只針對
xiaodu
庫。
# 選2、恢復:執行全量還原
mysql -u root -p xiaodu_A?< /usr/local/bin/mysql/backup/database_name_A.sql
# 恢復:節點恢復
mysql -u root -p xiaodu < /usr/local/bin/mysql/backup/part1_before_drop.sql
mysqlbinlog --start-position=4691 --stop-position=1825 /var/lib/mysql/mysql-bin.000005 | mysql -u root -p
mysqlbinlog --start-position=214 /path/to/mysql-bin.000008 | mysql -u root -p
mysqlbinlog /path/to/mysql-bin.000009 | mysql -u root -p
mysqlbinlog /path/to/mysql-bin.000010 | mysql -u root -p
mysqlbinlog /path/to/mysql-bin.000011 | mysql -u root -p
按時間回復:
mysqlbinlog --stop-datetime="2025-08-16 12:00:00" /var/lib/mysql/mysql-bin.000004 | mysql -u root -p
mysqldump
:用于全量備份,生成完整的數據庫備份文件。mysqlbinlog
:用于增量備份,記錄自上次全量備份以來的更改,支持基于時間點的恢復。
從 MySQL 8.4 開始,SHOW MASTER STATUS 已被棄用,取而代之的是 SHOW BINARY LOG STATUS。(MySQL中執行)
# MySQL 8.0 及以下版本:
SHOW MASTER STATUS;
# MySQL 8.4 及以上版本:
SHOW BINARY LOG STATUS;
SHOW BINARY LOGS;
四、Xtrabackup