mysqldump备份
数据恢复——只要备份和日志是完整的,恢复到故障前的时间点(快速)。
一、mysqldump备份策略
1、mysqldump常用参数说明:
--version, -V 输出mysqldump版本信息并退出
--help 显示帮助信息并退出
--password, -p 连接数据库密码
--user, -u 连接数据库的用户名
--port, -P 连接数据库端口号
--protocol 使用的连接协议,例如:tcp udp socket
--set-gtid-purged=AUTO/ON #在构建主从时,使用AUTO/ON
--set-gtid-purged=OFF #普通的本机备份恢复时,可以添加,用于取消掉binlog日志记录
[root@node2 mysql]# mysqldump -uroot -p -B m2 --protocol=tcp
*********************************************************
命令格式:
# mysqldump -uroot -p -A >/mysqlback/mysql_all.sql
作用:
将数据库所有内容备份至/mysqlback下,并设置文件名为mysql_all.sql
*********************************************************
------------------------------------------------------------------
--all-databases , -A 导出全部数据库(全备)
# mysqldump -uroot -p -A >/myback/mysql_all_back.sql
------------------------------------------------------------------
--databases -B 导出指定的数据库,可指定多个
mysqldump -uroot -p -B m2 test mysql a b
------------------------------------------------------------------
--no-create-db -n 导出数据表,但不导出库
mysqldump -uroot -p -B m2 -n
------------------------------------------------------------------
--no-create-info, -t 仅导出数据,不导出数据结构
mysqldump -uroot -p -B m2 -t
------------------------------------------------------------------
--no-data, -d 仅导出数据结构,不导出数据
mysqldump -uroot -p -A -d
------------------------------------------------------------------
--tables 导出指定的表,须配合-B使用
mysqldump -uroot -p -B m2 --tables test
------------------------------------------------------------------
--default-character-set 设置导出时数据库的字符集,默认为utf-8
mysqldump -uroot -p -B m2 --default-character-set=latin1
------------------------------------------------------------------
--where, -w 导出时,在后方添加条件语句,只导出符合条件的数据
mysqldump -uroot -p -B m2 --where="user='root'"
------------------------------------------------------------------
--flush-logs -F 开始导出之前刷新bin-log日志。
备注:如果一次导出多个库,将会多次刷新bin-log,只有在同时使用--lock-all-tables或者--master-data才不会出现类似情况
mysqldump -uroot -p -B m2 -F
------------------------------------------------------------------
--force 在导出过程中忽略出现的SQL错误
mysqldump -uroot -p -B m2 --force
------------------------------------------------------------------
--ignore-table 不导出指定表,如果要忽略多个表,需要使用多次该参数
例如:--ignore-table=m2.a --ignore-table=m2.b ……
mysqldump -uroot -p -B m2 --ignore-table=m2.a
------------------------------------------------------------------
--lock-all-tables, -x 导出数据库之前,先锁定所有表,确保导出时无数据插入,保证数据一致性
mysqldump -uroot -p -B m2 --lock-all-tables
------------------------------------------------------------------
--log-error 导出过程中,如果有错误信息,将写入到指定文件
mysqldump -uroot -p -B m2 --log-error=/root/mysqldump_err.log
------------------------------------------------------------------
--dump-date 导出时,在文件中添加导出时间,默认开启
mysqldump -uroot -p -B m2 --skip-dump-date
------------------------------------------------------------------
--socket,-S 导出时指定mysql的socket文件位置,默认路径/var/lib/mysql/mysql.sock
mysqldump -uroot -p -B m2 --socket=/tmp/mysqld.sock
------------------------------------------------------------------
2、基础备份参数
-A #全备份
例如:mysqldump -uroot -p123456 -A >/backup/full.2020-5-2.sql
-B #单库或者多库备份
例如:mysqldump -uroot -p123456 -B 库名 库名 库名 >/backup/full.2020-5-2.sql
表备份
例如:mysqldump -uroot -p123456 库名 表名 表名 >/backup/tab.2020-5-2.sql
3、特殊备份参数
-R #存储过程和函数
-E #事件,计划任务
--triggers #触发器
--master-data=2 #(1)记录备份时刻的binlog信息
(2)自动锁表,不加--single-transaction,温备份
加了--single-transaction,对于InnoDB表不锁表备份(快照备份)
--single-transaction #对于InnoDB表,进行一致性快照备份,不锁表
二、模拟误删数据库(切记不要在生产环境上演练)
周三,上午2点,数据库损坏(物理磁盘损坏,逻辑操作损坏)
恢复思路?
1、停业务,挂维护页,避免数据的二次伤害。
2、截取周二23:00 --- 周三10点误删除之间的binlog,恢复到临时库,测试可用性和完整性。
通过bin-log中记录时间恢复
# mysqlbinlog --start-datetime='2018-09-20 00:00:00' --stop-datetime='2018-09-31 12:00:00' mysql_bin.000001 >/backup/bin.sql
通过bin-log中记录的事务顺序恢复
mysqlbinlog --skip-gtids --include-gitds='aa648280-a6a6-11e9-949f-000c294alb3b:12-17' --exclude-gtids='aa648280-a6a6-11e9-949f-000c294alb3b:15' /data/binlog/mysql-bin.000002 >/backup/bin.sql
注意:mysql5.7版本默认二进制日志是不记录insert操作的,如果要开启只需在配置文件种加入:binlog_format=statement 后重启mysql即可
***********************************************************************************
show master status;
查看全备份出来的sql脚本,截取注释中的日志信息
--CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002(不固定)',MASTER_LOG_POS=753; #起点二进制数值为753
show binlog events in 'mysql-bin.000002'; #'mysql-bin.000002'取决于上面注释中的MASTER_LOG_FILE字段。
找到最后一行的Pos字段的二进制数值,为终点,例如为1519;
mysqlbinlog --skip-gtids --start-position=753 --stop-position=1519 /data/binlog/mysql-bin.000002 >/backup/bin.sql #截取操作日志生成差异备份脚本
恢复备份到临时库
mysql -s /data/3307/mysql.sock #连接到3307
set sql_log_bin=0 #设置二进制日志的关闭
source /backup/full_2020-5-2.sql; #恢复全备的数据
source /backup/bin.sql #恢复binlog的数据
3、将误删除的表导出,导入原生产库。
mysqldump -s /data/3307/mysql.sock -B backup >/backup/t1.sql
mysql -uroot -p123
set sql_log_bin=0
use backup
source /backup/t1.sql;
4、开启业务(处理结果:经过20分钟的处理,最终业务恢复正常)。
扩展参数:
--set-gtid-purged=AUTO/ON #在构建主从时,使用AUTO/ON
--set-gtid-purged=OFF #普通的本机备份恢复时,可以添加,用于取消掉binlog日志对此操作的记录
--max_allowed_packet=128M #控制备份时传输的数据包大小
从mysqldump 全备中获取库和表的备份
1、获取表结构
sed -e '/./{H;$!d;}' -e 'x;//CREATE TABLE `city`/!d;q' full.sql>createtable.sql
2、获取INSERT INTO 语句,用于数据的恢复
grep -i 'INSERT INTO `city`' full.sql>data.sql &
3、获取单库的备份
sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql