mysqldump备份

(1)crontab -l --------定期的恢复演练,一般一个季度或者半年。
  • 热备:根据数据量60G~80G,InnoDB支持
  • 温备:锁表备份,MyISAM支持
  • 冷备:业务关闭情况下备份
(2)数据恢复——只要备份和日志是完整的,恢复到故障前的时间点(快速)。

一、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
posted @ 2023-11-03 00:38  兰昌  阅读(52)  评论(0编辑  收藏  举报