数据库===》MySQL数据库备份恢复(mysqldump、xtrabackup)

percona xtrabackup下载地址:

https://www.percona.com/downloads/Percona-XtraBackup-LATEST/#

一、运维在数据库备份恢复方面的职责

1.设计备份策略

  • 全备、增量、时间、自动

2.日常备份检查

  • 备份存在性
  • 备份空间够用否

3.定期恢复演练(测试库)

  • 一季度 或者 半年

4.故障恢复

  • 通过现有备份,能够将数据库恢复到故障之前的时间点

5.迁移

  • 停机时间
  • 回退方案

二、备份类型

1.按照数据库的运行状态分类:

1) 热备(不停库,不停服务,备份,也不会(锁表)阻止用户的写入)

 #1.热备份(Hot Backup):
     热备份也称为在线备份(Online Backup)
     是指在数据库运行的过程中进行备份,对生产环境中的数据库运行没有任何影响。
     常见的热备方案是利用mysqldump、XtraBackup等工具进行备份。
     
 #2.优点:
         1.可在表空间或数据文件级备份,备份时间短。
         2.备份时数据库仍可使用。
         3.可达到秒级恢复(恢复到某一时间点上)。
         4.可对几乎所有数据库实体作恢复。
         5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
         
 #3.缺点:
         1.不能出错,否则后果严重。
         2.若热备份不成功,所得结果不可用于时间点的恢复。
         3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”

2) 冷备(停库,停服务,备份)

#1.冷备份(Cold Backup):
     冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。
     冷备份是将关键性文件拷贝到另外位置的一种说法。
     对于备份Oracle信息而言,冷备份是最快和最安全的方法。

#2.优点:
        1.是非常快速的备份方法(只需拷贝文件)
        2.容易归档(简单拷贝即可)
        3.容易恢复到某个时间点上(只需将文件再拷贝回去)
        4.能与归档方法相结合,作数据库“最新状态”的恢复。
        5.低度维护,高度安全。
        
#3.缺点:
        1.单独使用时,只能提供到“某一时间点上”的恢复。
        2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
        3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
        4.不能按表或按用户恢复。

3) 温备(不停库,不停服务,备份,会(锁表)阻止用户的写入)

#1.温备份(Warm Backup)
     在数据库运行时进行,但是会对当前数据库的操作有所影响
     例如加一个全局读锁以保证备份数据的一致性。
     
#2.特点总结:不停库,不停服务,备份,会(锁表)阻止用户的写入

三、备份方式及工具介绍

1.逻辑备份(mysqldump)

#1.逻辑备份:
         从数据库中导出数据另存而进行的备份
         是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现。

#2.逻辑备份工具:
        1. mysqldump是采用SQL级别的备份机制,他将数据表导成SQL脚本文件,是最常用的逻辑备份方法。
           逻辑备份速度比较慢,占用空间比较小。逻辑备份的恢复成本高。
        2.binlog方式(搭配mysqlbinlog)
        3.into outfile
	       1)配置数据库
		     vim /etc/my.cnf
		     secure-file-priv=/tmp
	       2)数据库使用命令导出(导出的就是数据)
		     select * from world.city into outfile '/tmp/world_city.data';
	 	4.replication(主从属于逻辑备份方式,但并不是真的备份方法)(主从是为了集群减轻数据库压力,但不是单纯的做备份)


优点:能使用编辑器处理,恢复简单,能基于网络恢复,有助于避免数据损坏
缺点:备份文件较大,备份较慢,无法保证浮点数的精度,使用逻辑备份数据恢复后,还需要手动重建索引,十分消耗cpu资源。

2.物理备份(xtrabackup(XBK))

#1.物理备份:
         备份数据文件了,比较形象点就是cp下数据文件,但真正备份的时候自然不是的cp这么简单。
        (物理备份又分两种 一种冷备份一种热备份)
  
#2.物理备份工具:
           1.mysqlhotcopy 物理备份工具,但只支持MyISAM引擎,基本上属于冷备的范畴,物理备份,速度比较快。
           2.xtrabackup(XBK) 以前很容易,现在很费劲,现在专门为InnoDB存储引擎出了一种方式,需要手动输入命令模拟redo和undo的过程


优缺点:物理备份恢复速度比较快,占用空间比较大。

3.按照业务划分:全备,增备,差异备

#1.全备:将全部数据备份(采用备份工具来备份)
#2.增量备分:基于全备之后,只备份每次备份过后修改后的数据(常采用binlog的方式来备份)
     - 恢复数据需要合并多次
     - 每个文件都是新数据,不会浪费磁盘空间
#3.差异备份:恢复数据只需要合并一次
     - 每个文件都包含重复内容,比较占用磁盘
#4.备份周期:根据数据量设计备份周期
     - 比如:周日全备,周1-周6增量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、逻辑备份和物理备份的比较

1.mysqldump (MDP)

优点:1.不需要下载安装
	 2.备份出来的是SQL,文本格式,可读性高,便于备份处理
	 3.压缩比较高,节省备份的磁盘空间
	 
缺点:1.依赖于数据库引擎,需要从磁盘把数据读出然后转换成SQL进行转储,比较耗费资源,数据量大的话效率较低建议:		 100G以内的数据量级,可以使用mysqldump,超过TB以上,我们也可能选择的是mysqldump,配合分布式的系统1EB  		 =1024 PB =1000000 TB

2.xtrabackup(XBK)

优点:1.类似于直接cp数据文件,不需要管逻辑结构,相对来说性能较高
缺点:1.可读性差
     2.压缩比低,需要更多磁盘空间

建议:
>100G<TB

五、逻辑备份工具Mysqldump

1.客户端通用参数

-u :指定用户 
-p :密码
-S :指定socket文件 
-h :IP
-P :端口号

本地备份:
mysqldump -uroot -p  -S /tmp/mysql.sock
远程备份:
mysqldump -uroot -p  -h 10.0.0.51 -P3306

2.命令格式

1.本地备份格式:
  mysqldump [选项] 数据库名 [表名] > 脚本名
  [root@web03 ~]# mysqldump -uroot -p1 oldboy backup > /backup/back.sql
  
2.远程备份格式:
  mysqldump [选项] [地址] > 脚本名
  [root@web03 ~]#   mysqldump -uroot -p123 -P3306 -A -h10.0.0.51 > /tmp/back.sql

3.选项说明

--all-databases  , -A    导出全部数据库。
mysqldump  -uroot -p --all-databases



--all-tablespaces  , -Y		导出全部表空间。
mysqldump  -uroot -p --all-databases --all-tablespaces


--no-tablespaces  , -y	不导出任何表空间信息。
mysqldump  -uroot -p --all-databases --no-tablespaces



--add-drop-database		每个数据库创建之前添加drop数据库语句。
mysqldump  -uroot -p --all-databases --add-drop-database


--add-drop-table	
每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项)
mysqldump  -uroot -p --all-databases  (默认添加drop语句)
mysqldump  -uroot -p --all-databases –skip-add-drop-table  (取消drop语句)


--add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK  TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
mysqldump  -uroot -p --all-databases  (默认添加LOCK语句)
mysqldump  -uroot -p --all-databases –skip-add-locks   (取消LOCK语句)


--allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。
mysqldump  -uroot -p --all-databases --allow-keywords


--apply-slave-statements
在'CHANGE MASTER'前添加'STOP SLAVE',并且在导出的最后添加'START SLAVE'。
mysqldump  -uroot -p --all-databases --apply-slave-statements


--character-sets-dir
字符集文件的目录
mysqldump  -uroot -p --all-databases  --character-sets-dir=/usr/local/mysql/share/mysql/charsets


--comments
附加注释信息。默认为打开,可以用--skip-comments取消
mysqldump  -uroot -p --all-databases  (默认记录注释)
mysqldump  -uroot -p --all-databases --skip-comments   (取消注释)


--compatible
导出的数据将和其它数据库或旧版本的MySQL 相兼容。值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,
要使用几个值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。
mysqldump  -uroot -p --all-databases --compatible=ansi


--compact
导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys
mysqldump  -uroot -p --all-databases --compact


--complete-insert,  -c
使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。
mysqldump  -uroot -p --all-databases --complete-insert


--compress, -C
在客户端和服务器之间启用压缩传递所有信息
mysqldump  -uroot -p --all-databases --compress


--create-options,  -a
在CREATE TABLE语句中包括所有MySQL特性选项。(默认为打开状态)
mysqldump  -uroot -p --all-databases


--databases,  -B
导出几个数据库。参数后面所有名字参量都被看作数据库名。
mysqldump  -uroot -p --databases test mysql


--debug
输出debug信息,用于调试。默认值为:d:t:o,/tmp/mysqldump.trace
mysqldump  -uroot -p --all-databases --debug
mysqldump  -uroot -p --all-databases --debug=” d:t:o,/tmp/debug.trace”


--debug-check
检查内存和打开文件使用说明并退出。
mysqldump  -uroot -p --all-databases --debug-check


--debug-info
输出调试信息并退出
mysqldump  -uroot -p --all-databases --debug-info


--default-character-set
设置默认字符集,默认值为utf8
mysqldump  -uroot -p --all-databases --default-character-set=latin1


--delayed-insert
采用延时插入方式(INSERT DELAYED)导出数据
mysqldump  -uroot -p --all-databases --delayed-insert


--delete-master-logs
master备份后删除日志. 这个参数将自动激活--master-data。
mysqldump  -uroot -p --all-databases --delete-master-logs


--disable-keys
对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;语句引用INSERT语句。这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。该选项只适合MyISAM表,默认为打开状态。
mysqldump  -uroot -p --all-databases 


--dump-slave
该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。
mysqldump  -uroot -p --all-databases --dump-slave=1
mysqldump  -uroot -p --all-databases --dump-slave=2


--events, -E
导出事件。
mysqldump  -uroot -p --all-databases --events


--extended-insert,  -e
使用具有多个VALUES列的INSERT语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用--skip-extended-insert取消选项。
mysqldump  -uroot -p --all-databases
mysqldump  -uroot -p --all-databases--skip-extended-insert   (取消选项)


--fields-terminated-by
导出文件中忽略给定字段。与--tab选项一起使用,不能用于--databases和--all-databases选项
mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=#”


--fields-enclosed-by
输出文件中的各个字段用给定字符包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项
mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=#”


--fields-optionally-enclosed-by
输出文件中的各个字段用给定字符选择性包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项
mysqldump  -uroot -p test test --tab=”/home/mysql”  --fields-enclosed-by=#” --fields-optionally-enclosed-by  =”#”


--fields-escaped-by
输出文件中的各个字段忽略给定字符。与--tab选项一起使用,不能用于--databases和--all-databases选项
mysqldump  -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=#”


--flush-logs
开始导出之前刷新日志。
请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。
mysqldump  -uroot -p --all-databases --flush-logs


--flush-privileges
在导出mysql数据库之后,发出一条FLUSH  PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。
mysqldump  -uroot -p --all-databases --flush-privileges



--force
在导出过程中忽略出现的SQL错误。
mysqldump  -uroot -p --all-databases --force


--help
显示帮助信息并退出。
mysqldump  --help


--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。
mysqldump  -uroot -p --all-databases --hex-blob


--host, -h
需要导出的主机信息
mysqldump  -uroot -p --host=localhost --all-databases


--ignore-table

不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump  -uroot -p --host=localhost --all-databases --ignore-table=mysql.user


--include-master-host-port
在--dump-slave产生的'CHANGE  MASTER TO..'语句中增加'MASTER_HOST=<host>,MASTER_PORT=<port>'  
mysqldump  -uroot -p --host=localhost --all-databases --include-master-host-port


--insert-ignore
在插入行时使用INSERT IGNORE语句.
mysqldump  -uroot -p --host=localhost --all-databases --insert-ignore


--lines-terminated-by
输出文件的每行用给定字符串划分。与--tab选项一起使用,不能用于--databases和--all-databases选项。
mysqldump  -uroot -p --host=localhost test test --tab=”/tmp/mysql”  --lines-terminated-by=##”


--lock-all-tables,  -x
提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。
mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables


--lock-tables,  -l
开始导出前,锁定所有表。用READ  LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。
请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。
mysqldump  -uroot -p --host=localhost --all-databases --lock-tables



--log-error
附加警告和错误信息到给定文件
mysqldump  -uroot -p --host=localhost --all-databases  --log-error=/tmp/mysqldump_error_log.err


--master-data
该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE  MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。
mysqldump  -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump  -uroot -p --host=localhost --all-databases --master-data=2;


--max_allowed_packet
服务器发送和接受的最大包长度。
mysqldump  -uroot -p --host=localhost --all-databases --max_allowed_packet=10240



--net_buffer_length
TCP/IP和socket连接的缓存大小。
mysqldump  -uroot -p --host=localhost --all-databases --net_buffer_length=1024


--no-autocommit
使用autocommit/commit 语句包裹表。
mysqldump  -uroot -p --host=localhost --all-databases --no-autocommit



--no-create-db,  -n
只导出数据,而不添加CREATE DATABASE 语句。
mysqldump  -uroot -p --host=localhost --all-databases --no-create-db



--no-create-info,  -t
只导出数据,而不添加CREATE TABLE 语句。
mysqldump  -uroot -p --host=localhost --all-databases --no-create-info


--no-data, -d
不导出任何数据,只导出数据库表结构。
mysqldump  -uroot -p --host=localhost --all-databases --no-data



--no-set-names,  -N
等同于--skip-set-charset
mysqldump  -uroot -p --host=localhost --all-databases --no-set-names


--opt
等同于--add-drop-table,  --add-locks, --create-options, --quick, --extended-insert, --lock-tables,  --set-charset, --disable-keys 该选项默认开启,  可以用--skip-opt禁用.
mysqldump  -uroot -p --host=localhost --all-databases --opt



--order-by-primary
如果存在主键,或者第一个唯一键,对每个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工作花费很长时间。 
mysqldump  -uroot -p --host=localhost --all-databases --order-by-primary



--password, -p
连接数据库密码


--pipe(windows系统可用)
使用命名管道连接mysql
mysqldump  -uroot -p --host=localhost --all-databases --pipe


--port, -P
连接数据库端口号


--protocol
使用的连接协议,包括:tcp, socket, pipe, memory.
mysqldump  -uroot -p --host=localhost --all-databases --protocol=tcp


--quick, -q
不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。
mysqldump  -uroot -p --host=localhost --all-databases 
mysqldump  -uroot -p --host=localhost --all-databases --skip-quick


--quote-names,-Q
使用(`)引起表和列名。默认为打开状态,使用--skip-quote-names取消该选项。
mysqldump  -uroot -p --host=localhost --all-databases
mysqldump  -uroot -p --host=localhost --all-databases --skip-quote-names



--replace
使用REPLACE INTO 取代INSERT INTO.
mysqldump  -uroot -p --host=localhost --all-databases --replace


--result-file,  -r
直接输出到指定文件中。该选项应该用在使用回车换行对(\\r\\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。
mysqldump  -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt


--routines, -R
导出存储过程以及自定义函数。
mysqldump  -uroot -p --host=localhost --all-databases --routines


--set-charset
添加'SET NAMES  default_character_set'到输出文件。默认为打开状态,使用--skip-set-charset关闭选项。
mysqldump  -uroot -p --host=localhost --all-databases 
mysqldump  -uroot -p --host=localhost --all-databases --skip-set-charset


--single-transaction
该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK  TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。
mysqldump  -uroot -p --host=localhost --all-databases --single-transaction


--dump-date
将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。
mysqldump  -uroot -p --host=localhost --all-databases
mysqldump  -uroot -p --host=localhost --all-databases --skip-dump-date


--skip-opt
禁用–opt选项.
mysqldump  -uroot -p --host=localhost --all-databases --skip-opt


--socket,-S
指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock
mysqldump  -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock


--tab,-T
为每个表在给定路径创建tab分割的文本文件。注意:仅仅用于mysqldump和mysqld服务器运行在相同机器上。
mysqldump  -uroot -p --host=localhost test test --tab="/home/mysql"


--tables
覆盖--databases (-B)参数,指定需要导出的表名。
mysqldump  -uroot -p --host=localhost --databases test --tables test


--triggers

导出触发器。该选项默认启用,用--skip-triggers禁用它。
mysqldump  -uroot -p --host=localhost --all-databases --triggers


--tz-utc
在导出顶部设置时区TIME_ZONE='+00:00' ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。
mysqldump  -uroot -p --host=localhost --all-databases --tz-utc


--user, -u
指定连接的用户名。


--verbose, --v
输出多种平台信息。


--version, -V
输出mysqldump版本信息并退出


--where, -w
只转储给定的WHERE条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。
mysqldump  -uroot -p --host=localhost --all-databases --where=” user=’root’”


--xml, -X

导出XML格式.
mysqldump  -uroot -p --host=localhost --all-databases --xml


--plugin_dir
客户端插件的目录,用于兼容不同的插件版本。
mysqldump  -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin”


--default_auth
客户端插件默认使用权限。

4.常用选项以及语句示例

1.备份全部数据库
mysqldump -u root -p --all-databases > /backup/full.sql

2.备份指定的多个库
mysqldump -u root -p --database mysql world > /backup/a.sql

3.备份指定库内的多个表(world库内city和country表)
mysqldump -u root -p world city country > /backup/b.sql
或
mysqldump -u root -p -B world --tables city country > /backup/c.sql

5.常用高级参数

1) 特殊参数1使用(必须要加)

-R            备份存储过程及函数
-E            备份事件
--triggers    备份触发器

mysqldump -uroot -p -A -R -E --triggers >/backup/d.sql

2)特殊参数2使用

-F  在备份开始时,刷新一个新binlog日志
mysqldump -uroot -p  -A  -R --triggers -F >/bak/full.sql

--master-data=2
以注释的形式,保存备份开始时间点的binlog的状态信息
mysqldump -uroot -p  -A  -R --triggers --master-data=2   >/back/e.sql

[root@db01 ~]# grep 'CHANGE' /backup/world.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=194;

功能:
(1)在备份时,会自动记录,二进制日志文件名和位置号
    0  默认值
    1  以change master to命令形式,可以用作主从复制
    2  以注释的形式记录,备份时刻的文件名+postion号
(2) 自动锁表
(3)如果配合--single-transaction,只对非InnoDB表进行锁表备份,InnoDB表进行“热”备,实际上是实现快照备份。


--single-transaction
innodb 存储引擎开启热备(快照备份)功能       
master-data可以自动加锁
(1)在不加--single-transaction ,启动所有表的温备份,所有表都锁定
(1)加上--single-transaction ,对innodb进行快照备份,对非innodb表可以实现自动锁表功能


完整备份命令
[root@web03 ~]# mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction > /backup/f.sql

6.压缩备份并添加时间戳

例子:
mysqldump -uroot -p123 -A  -R  --triggers --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F).sql.gz

mysqldump -uroot -p123 -A  -R  --triggers --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F-%T).sql.gz

#导入使用解压吗?(导出的时候压缩了,再解压导入太多余了)
zcat /backup/full_$(date +%F).sql.gz | mysql -uroot -p123456

七、企业故障模拟恢复

1.背景环境:

正在运行的网站系统,mysql-5.6.46 数据库,数据量10G,日业务增量1-5M。

2.备份策略:

每天23:00点,计划任务调用mysqldump执行全备脚本

3.故障时间点:

年底故障演练:模拟周三上午10点误删除数据库,并进行恢复

4.思路:

1、停业务,避免数据的二次伤害
2、找一个临时库,恢复周三23:00全备
3、截取周二23:00 — 周三10点误删除之间的binlog,恢复到临时库
4、测试可用性和完整性
5、解决办法

  • 方法一:直接使用临时库顶替原生产库,前端应用割接到新库
  • 方法二:将误删除的表导出,导入到原生产库

6、开启业务
处理结果:经过20分钟的处理,最终业务恢复正常

5.故障模拟演练

1)准备数据

#1.数据库内准备数据
create database backup;
use backup
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
#2.数据库外准备备份数据目录
[root@web03 ~]# mkdir /backup  
若已有备份目录,查看内容是否有用,无有可清楚,避免环境影响
[root@web03 ~]# rm -rf /backup/*

2) 周二 23:00全备

[root@web03 ~]# mysqldump -uroot -p123 -A  -R  --triggers --set-gtid-purged=OFF --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F).sql.gz

3)模拟周二 23:00到周三 10点之间数据变化

#1.数据库内插入新数据
use backup
insert into t1 values(11),(22),(33);
commit;
create table t2 (id int);
insert into t2 values(11),(22),(33);

4)模拟故障,删除表(只是模拟,不代表生产操作)

mysql> drop database backup;

6.恢复过程

1)准备临时数据库(多实例3307或另一台数据库服务器)

# 此处是另一台服务器作为演示
(1)准备全备并拷贝至另一台数据库实例
[root@localhost ~]# mkdir /backup
[root@localhost ~]# scp [email protected]:/backup/full_2021-02-05.sql.gz /backup/
[root@localhost ~]# gunzip /backup/full_2021-02-05.sql.gz


(2)截取二进制日志(生产库上查找binlog日志并拷贝至第二台服务器)
1.找到起始位置点:去全备的sql里面找到备份时刻位置点
[root@localhost ~]# head -50 /backup/full_2021-02-05.sql | grep 'MASTER_LOG_POS'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=788168;

2.找到结束位置点:
	mysql> show binlog events in 'mysql-bin.000004';
	788821 | drop database backup    #drop命令之前的结束点或者drop命令的开始点
	
3.取出位置点之间新增的数据
[root@localhost mysql]#  mysqlbinlog --start-position=788168 --stop-position=788821 mysql-bin.000004 > /backup/xin_$(date +%F).sql

4.拷贝至第二台服务器
[root@localhost ~]# scp [email protected]:/backup/xin_2021-02-05.sql /backup/

2)将全备数据以及增量数据恢复至第二台数据库实例

[root@localhost ~]# mysql -u root -p123456
mysql> source /backup/full_2021-02-05.sql
mysql> source /backup/xin_2021-02-05.sql

说明:这里不直接在故障服务器上恢复数据库的原因是如果备份数据有误会导致数据二次损坏
     在第二台数据库上恢复查看一下,没错,在恢复到第一台上

3)查看数据库以及表数据

mysql> show databases;
mysql> use backup
mysql> show tables;

4)恢复生产环境数据并启动服务

在第二台临时数据库上导出backup库,并拷贝至生产服务器
[root@localhost backup]# mysqldump -u  root -p -R -E --triggers --single-transaction --master-data=2 --database backup > /backup/backup.sql
[root@localhost backup]# scp /backup/backup.sql [email protected]:/backup/


生产数据库上导入数据
mysql> source /backup/backup.sql

恢复压缩包格式的数据文件可在数据库外直接导入数据库内
[root@web03 ~]# zcat /backup/backup.sql | mysql -uroot -p1

八、物理备份(xtrabackup)

1、xtrabackup介绍

Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。

Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup
1)xtrabackup 是专门用来备份InnoDB表的,和mysql server没有交互;
2)innobackupex 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
3)xbcrypt 加密解密备份工具
4)xbstream 流传打包传输工具,类似tar

2、xtrabackup优点

Xtrabackup优点

  • 备份速度快,物理备份可靠
  • 备份过程不会打断正在执行的事务(无需锁表)
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据

3、xtrabackup备份原理

Xtrabackup备份流程图:

img

备份流程:
(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;

(2)xtrabackup在备份innoDB数据时,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)

(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)

(5)innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。

(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;

(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;

(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;

(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

4、增量备份介绍

xtrabackup增量备份的原理是:
    1)首先完成一个完全备份,并记录下此时检查点LSN;
    2)然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是 则备份该页并记录当前检查点的LSN。
  
  
增量备份优点:
1)、数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;

2)、支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;

3)、每日备份只产生少量数据,也可采用远程备份,节省本地空间;

4)、备份恢复基于文件操作,降低直接对数据库操作风险;

5)、备份效率更高,恢复效率更高。

5、xtrabackup安装

1)上传或下载xtrabackup软件包

方式一:服务器直接下载
#安装依赖
[root@localhost packages]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

#下载Xtrabackup
[root@localhost packages]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm


方式二:本地下载完成后上传至服务器
percona官网下载地址

https://www.percona.com/downloads/Percona-XtraBackup-LATEST/#

2)安装xtrabackup软件包

[root@localhost packages]# yum install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm -y


Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:  
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作             
   一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录
   --no-timestamp	备份时去除时间戳
   --user-memory	恢复时指定占用内存大小

九、xtrabackup备份以及恢复

1.xtrabackup全量备份以及恢复

1)备份文件说明

#在备份的同时,innobackupex还会在备份目录中生成以下文件:
(1)xtrabackup_checkpoints -- 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:

每个InnoDB页(通常为16k大小)
都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info  --  mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。

(3)xtrabackup_info		--存储UUID,数据库是由自己的UUID的,如果相同,做主从会有问题
	
(4)xtrabackup_logfile	--就是redo

(5)backup-my.cnf  --  备份命令用到的配置选项信息。

2)全量备份流程

1.准备测试数据
[root@localhost ~]# mysql -u root -p123456
mysql> create database backup;
mysql> use backup
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;

2.准备备份目录
[root@localhost ~]# mkdir /backup

3.进行全备(直接执行第五步)
[root@localhost ~]# innobackupex --user=root --password=123456 /backup/full

4.查看文件
[root@localhost ~]# ll /backup/full/

#文件名有时间戳,我们在写备份脚本和恢复脚本,恢复的时候必须指定上一次备份的目录,备份时间我们没办法确定,时分秒太难精确到了(金融公司喜欢每天全备,每小时增备)

5.去除时间戳全备
[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp /backup/full

6.再次查看文件
[root@localhost ~]# ll /backup/full/

3)全备恢复流程

1.连接数据库删除数据库
	mysql> drop database backup;
	
2.停止数据库
	[root@localhost ~]# systemctl stop mysql
	
2.一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。innobackupex命令的--apply-log选项可用于实现上述功能
将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚
	[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --use-memory=1G /backup/full
	

在实现"准备"的过程中,innobackupex通常还可以使用--user-memory选项来指定其可以使用的内存的大小,默认为100M.如果有足够的内存空间可用,可以多划分一些内存给恢复的过程,以提高其完成备份的速度。


全备恢复方式一:以下动作需在mysql data目录下执行,如源码安装可使用此方式
	[root@localhost ~]# mv data /tmp/
	[root@localhost ~]# cp -r /backup/full ./data
	#授权
	[root@localhost ~]# chown -R mysql.mysql data 



全备恢复方式二
也可以不使用cp,重新定义一个data目录,并修改配置文件
	#恢复的时候会报错,必须指定恢复的位置,修改配置文件 datadir
	datadir=/backup/data
	
	#创建新的data目录
	[root@localhost ~]# mkdir /backup/data/
	[root@localhost ~]# innobackupex --copy-back /backup/full
	#授权
	[root@localhost ~]# chown -R mysql.mysql /backup/data 

4)启动数据库服务查看恢复情况

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -u root -p123456
mysql> show databases;
mysql> use backup
mysql> show tables;
mysql> select * from t1;

5)总结全库备份与恢复三步曲:

innobackupex全量备份,并指定备份目录路径;

在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;

恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

2.增量备份以及恢复

1)增量备份说明

1.基于上一次全备进行增量
2.增量备份无法单独恢复,必须基于全备进行恢复
3.所有增量必须要按顺序合并到全备当中

2)增量备份流程

第一次增量数据以及增量备份

1.先做全量备份
[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp  /backup/full

2.模拟新增数据
[root@localhost ~]# mysql -uroot -p123456
mysql> create database xtra;
mysql> use xtra;
mysql> create table test1(id int);
mysql> insert into test1 values(1),(2),(3);
mysql> create table test2(id int);
mysql> insert into test2 values(11),(22),(33);
mysql> commit;

3.第一次增量备份
参数说明:
--incremental:开启增量备份功能
--incremental-basedir:上一次备份的路径

[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/backup/full  /backup/xtra1

4.检查增量备份数据与全量数据是否衔接正确
[root@localhost ~]# cat /backup/full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 2718258
last_lsn = 2718258

[root@localhost ~]# cat /backup/xtra1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2718258             #该值应该与全备的to_lsn一致
to_lsn = 2733139
last_lsn = 2733139

第二次增量数据以及增量备份

1.模拟新增数据
[root@localhost ~]# mysql -u root -p123456
mysql> create database xtra2;
mysql> use xtra2
mysql> create table test3(id int);
mysql> insert into test3 values(21),(22),(23);
mysql> create table test4(id int);
mysql> insert into test4 values(31),(32),(33);
mysql> commit;


2.第二次进行增量备份:注意第二次增量备份是针对第一次增量备份而言,所以需指定第一次增量备份的目录
[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/backup/xtra1 /backup/xtra2

3.检查备份数据lsn是否衔接
[root@localhost ~]# cat /backup/xtra1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2718258
to_lsn = 2733139
last_lsn = 2733139

[root@localhost ~]# cat /backup/xtra2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2733139              #第二次增量的from lsn应与第一次增量的to lsn相同
to_lsn = 2747171
last_lsn = 2747171

差异备份说明

#第一次增量与差异备份相同,第二次增量如果选择增备目标是全备文件,则这一次是差异备份
[root@localhost ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/chayi

#查看是否与全备的to_lsn相同
[root@localhost ~]# cat /backup/chayi/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2718258
to_lsn = 2747171

3)增量恢复流程

1.恢复思路
	1)full+xtra1+xtra2   #整合三个文件
	2)需要将xtra1和xtra2按顺序合并到full中,分步骤进行--apply-log(不是每一步都要模拟CSR)
	3)删除数据库
		mysql> drop database xtra2;
		
		
2.合并全备数据,只做redo,不做undo
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/full
[root@localhost ~]# cat /backup/full/xtrabackup_checkpoints
#记录全备的lsn
to_lsn = 2718258
last_lsn = 2718258

3.合并第一次增量数据到全备数据中,只做redo,不做undo
[root@localhost ~]# innobackupex --apply-log --redo-only --increment-dir=/backup/xtra1 /backup/full
[root@localhost ~]# cat /backup/full/xtrabackup_checkpoints
#再次记录全备的lsn
to_lsn = 2733139
last_lsn = 2733139

4.合并第二次增量数据到全备数据中,redo undo都做,去掉--redo-only选项
[root@localhost ~]# innobackupex --apply-log --incremental-dir=/backup/xtra2 /backup/full
[root@localhost ~]# cat /backup/full/xtrabackup_checkpoints
to_lsn = 2747171
last_lsn = 2747171

5.停止数据库服务,恢复数据
[root@localhost ~]# systemctl stop mysqld
#修改/etc/my.cnf文件,将数据目录指向新的目录并创建目录
datadir=/backup/data1

[root@localhost ~]# mkdir /backup/data1
#修改data1目录属主属组
[root@localhost ~]# chown -R mysql.mysql /backup/data1
[root@localhost ~]# innobackupex --copy-back  /backup/full/

4)启动数据库服务并检查数据恢复情况

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -u root -p123456
mysql> show databases;
mysql> use xtra2
mysql> show tables;
mysql> select * from test3;
mysql> select * from test4;

6.2.5 增量备份与恢复总结

(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;

(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

十、xtrabackup脚本

备份:

#!/bin/bash 
#测试全备命令
#innobackupex --defaults-file=/data2/linksus/apps/linksus_beta/my.cnf  --no-timestamp --host=10.10.0.172 --user=backup --password=backup --port=7001 --socket=/data2/linksus/apps/linksus_beta/tmp/mysql.7001.sock  /test/data

BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`  #begining time 
format_time=`date +"%Y-%m-%d_%H:%M:%S"` 
#oldDate=$(date -d "-7 days" "+%Y-%m-%d_%H:%M:%S")
oldDate=$(date -d "-7 days" "+%Y-%m-%d_%H")
week=`date +%w`  #week number
backdir=/data/Xtrabackup  #backup folder
file_cnf=/data/linksus/mysql_7001/my.cnf
user_name=linksus_dba 
password=[email protected]
out_log=$backdir/xtrabackup_log_$format_time 
time_cost=$backdir/xtrabackup_time.txt
if [ -d "$backdir/incr6" ];then 
    rm -rf $backdir-${oldDate}*
    mv $backdir $backdir-$format_time
    mkdir $backdir 
else
    mkdir -p  $backdir
fi





###### Start backup now, Sunday full backup other days is incremental backup ###### 

if [ ! -d "$backdir/full" ] && [ $week -eq 0 ];then
		echo "#####start sunday full backup at  $BEGINTIME to directory full" >>$time_cost
  		innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock $backdir/full 1> $out_log 2>&1
		exit 1
fi
if [ ! -d "$backdir/incr1" ] && [ $week -eq 1 ];then 
        echo "#####start incremental 1 backup at $BEGINTIME to directory incr1" >>$time_cost 
        innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/full --incremental $backdir/incr1 1> $out_log 2>&1
		exit 1
fi
if [ ! -d "$backdir/incr2" ] && [ $week -eq 2 ];then
        echo "#####start incremental 2 backup at $BEGINTIME to directory incr2" >>$time_cost
		innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr1 --incremental $backdir/incr2 1> $out_log 2>&1
         exit 1
fi
if [ ! -d "$backdir/incr3" ] && [ $week -eq 3 ];then
        echo "#####start incremental 3 backup at $BEGINTIME to directory incr3" >>$time_cost
		innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr2 --incremental $backdir/incr3 1> $out_log 2>&1
         exit 1
fi
if [ ! -d "$backdir/incr4" ] && [ $week -eq 4 ];then
        echo "#####start incremental 4 backup at $BEGINTIME to directory incr4" >>$time_cost
		innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr3 --incremental $backdir/incr4  1> $out_log 2>&1
         exit 1  
fi
if [ ! -d "$backdir/incr5" ] && [ $week -eq 5 ];then
        echo "#####start incremental 5 backup at $BEGINTIME to directory incr5" >>$time_cost
		innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr4 --incremental $backdir/incr5  1> $out_log 2>&1
         exit 1
fi
if [ ! -d "$backdir/incr6" ] && [ $week -eq 6 ];then
        echo "#####start incremental 6 backup at $BEGINTIME to directory incr6" >>$time_cost
         innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr5 --incremental $backdir/incr6  1> $out_log 2>&1
		 exit 1
fi
### END weekly backup ###


#恢复:

#!/bin/bash

#backdir=/databackup/db_backup/Xtrabackup
#backdir=/data/Xtrabackup

#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr1/ 1>$backdir/huifu.log1 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr2/ 1>$backdir/huifu.log2 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr3/ 1>$backdir/huifu.log3 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr4/ 1>$backdir/huifu.log4 2>&1
#innobackupex --apply-log --redo-only --use-memory=2G $backdir/full/ --incremental-dir=$backdir/incr5/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --redo-only --use-memory=2G $backdir/full/ --incremental-dir=$backdir/incr6/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --use-memory=2G $backdir/full/ 1> $backdir/fuifu.log 2>&1
#innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back $backdir/full/

十一、mysqldump脚本

#!/bin/bash

user='mha'
password='mha'
host='10.0.0.51'
port=3306
backup_dir='/backup'
date=`date +%F`
binglog_dir='/var/lib/mysql'

/usr/bin/mysqldump  -h ${host} -P ${port} -u ${user} -p${password} -A -R -E
--triggers --single-transcation --master-sata=2 > ${backup_dir}/full_$date.s
ql

if [ $? == 0 ];then
        echo"${date} mysqldump backup successfull" >> ${backup_dir}/backup.l
og
else
        echo"${date} mysqldump backup failed" >> ${backup_dir}/error.log
fi
scp root@${host}:${binlog_dir}/mysql-bin.00000* ${backup}/
find /backup -mtine +30 -name "*.sql" | xargs rm -f

猜你喜欢

转载自blog.csdn.net/weixin_52492280/article/details/114548529