MySQL-备份与恢复
参考
精选:https://mp.weixin.qq.com/s/wMxBrKJDk70dLGmUFO-aEg
mysqldump 导出与导入
https://juejin.im/entry/6844903511201677325
注意: 为了保证数据备份的一致性,myisam 存储引擎在备份时需要加上 -l 参数
, 表示将所有表加上读锁,在备份期间,所有表将只能读而不能进行数据更新。但是对于事务存储引擎来说,可以采用更好的选项 –single-transaction,此选项使得 innodb 存储引擎得到一个快照 (snapshot),使得备份的数据能够保证一致性
导出
如果没有指定数据库中的任何表,默认导出所有数据库中的所有表
所有数据库「用户 scm 权限内」
语法:mysqldump [options] –all-database > filename.sql
1 | mysqldump -hlocalhost -u scm -p -l -F --all-database > alldatabase.sql |
数据库 test
语法:mysqldump [options] –database DB1 [DB2,DB3…] > filename.sql
1 | mysqldump -u scm -p -l -F test > test.sql |
数据库 test 下的表
用法:mysqldump [options] db_name [table1 table2 table3…]
单个表 emp
1 | mysqldump -u scm -p -l -F test emp > test_emp.sql |
多个表 emp 和 dept
1 | mysqldump -u scm -p -l -F test emp dept > test_emp_dept.sql |
导入
mysqldump 的恢复也很简单,将备份作为输入执行即可:
1 | mysql -u scm -p db_name < alldatabase.sql |
注意,将备份恢复后数据并不完整,还需要将备份后执行的日志进行重做:
1 | mysqlbinlog binlog-file | mysql -uroot -p |
完整的 mysqldump 备份与恢复示例
凌晨 2:00 备份数据库
1 | root@bogon:/usr/local/mysql/bin$ ./mysqldump -uroot -p -l -F t2 > t2.dmp |
其中 -l 参数表示给所有表加读锁,-F 表示生成一个新的日志文件
,此时,t2 中 emp 表的数据如下:
1 | # 为了便于测试,执行 reset master 删除所有 binlog。 |
备份完毕后,插入新的数据
1 | # 因为上一步执行是加入了 -F 选项, 所以接下来的操作会被记录到新的二进制文件,即名为 mysql-bin.000002 的文件 |
数据库突然故障
模拟删库跑路:
1 | # 这里为了便于测试,不把删库操作记入日志,当前 session 设置 sql_log_bin 为 off。 |
数据恢复
1 | root@bogon:/usr/local/mysql/bin# ./mysql -e "create database t2" |
使用 mysqlbinlog 恢复自 mysqldump 备份以来的 binglog
根据前面操作的内容,可知从备份的时间点到删库的时间点之间的操作被记录到了 mysql-bin.000002 文件中
1 | root@bogon:/usr/local/mysql/bin# ./mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 | ./mysql t2 |
至此,数据恢复成功。
Navicat 导出、导入
参考《Navicat-Premium》
MySQL Workbench 导入、导出
参考《MySQL-Workbench》
MySQL 定时备份「重点」
注意:千万不要以为有了备份就万无一失了,平时也要多检查备份脚本执行是否正确,生产的备份脚本内容是否可用,最好可以定期做恢复演练
Linux
备份脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -------------------------------------------------------------------------------
# FileName: mysql_backup.sh
# Describe: Used for database backup
# Revision: 1.0
# Date: 2020/08/11
# Author: wang
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user = "root"
mysql_password = "yourpassword"
mysql_host = "localhost"
mysql_port = "3306"
backup_dir = /data/mysql_backup
dt=date +'%Y%m%d_%H%M'
echo "Backup Begin Date:" $(date +"%Y-%m-%d %H:%M:%S")
# 备份全部数据库
mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -R -E --all-databases --single-transaction | gzip > $backup_dir/mysql_backup_$dt.sql.gz
mysqladmin -uroot -p123456 flush-logs
find $backup_dir -mtime +90 -type f -name '*.sql' -exec rm -rf {} \;
echo "Backup Succeed Date:" $(date +"%Y-%m-%d %H:%M:%S")定时任务
1
2# 每天凌晨 2 点进行备份; 注意脚本执行权限及修改脚本路径
00 02 * * * sh /root/scripts/mysql_backup.sh > /root/scripts/mysql_backup.log 2>&1
Windows
先安装 gzip,安装路径示例:”C:\Program Files (x86)\GnuWin32\bin\gzip.exe”
gzip 下载地址:Gzip for Windows (sourceforge.net)
选择安装包 【Complete package, except sources】
备份脚本
比如我们可以在 E 盘下创建一个 MySQLdata_Bak 目录,此目录下创建 mysql_backup 目录存放备份文件,mysql_bak.bat 是备份脚本,脚本内容如下(自动删除 90 天前的备份文件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15rem auther:wang
rem date:20200811
rem ******MySQL backup start********
@echo off
forfiles /p "D:\prod\MySQL\MySQL8DataBack" /m tcboot_*.sql -d -90 /c "cmd /c del /f @path"
set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"
"D:\prod\MySQL\MySQL8\bin\mysqldump" -utcboot_zhzf -ptcboot_zhzf -P3306 --default-character-set=utf8 -R -E --single-transaction tcboot_zhzf | "C:\Program Files (x86)\GnuWin32\bin\gzip.exe" > "D:\prod\MySQL\MySQL8DataBack\tcboot_zhzf_%Ymd%.sql.gz"
"D:\prod\MySQL\MySQL8\bin\mysqladmin" -uroot -p123456 flush-logs
@echo on
rem ******MySQL backup end********脚本调试完成后就可以加入计划任务