4. mysql的备份方式。
mysql数据库按照其服务的运行状态,即停库和非停库,停库的备份叫冷备,非停库的叫热备。热备份分为逻辑备份和裸文件备份(物理备份)。按备份量又有全量和增量备份。
4.1冷备及其恢复.
Mysql的冷备就是在数据库停止的状态下进行备份,好处是可以保证数据库的完整性,备份和恢复都比较快速,但是数据库停止会影响业务,无法访问数据库,所以冷备一般用于不那么重要的业务使用。
1,首先停止数据库
/usr/local/mysql/bin/mysqladmin -uroot -p123456 shutdown
确保mysql进程已经关闭
2,备份过程为复制整个数据目录到远程的服务器上,或者本地磁盘。为了简便。只列出步骤。如下:
scp -r /data/mysql/ root@远程机器IP:/远程机器目录
cp -r /data/mysql /本地目录
恢复:
只需要把备份的数据目录替换即可,记得源目录要备份一下,然后重启mysql。
4.2热备及恢复
热备即为在不停库的状态下进行备份,其中有逻辑备份和物理备份
逻辑备份即将sql执行语句备份,恢复的时候执行sql语句来恢复。一般有mysqldump,mydumper等工具
物理备份即备份数据文件,一般的工具有percona公司的XtraBackup的热备软件进行备份。
4.2.1 mysqldump工具备份与恢复
Mysqldump的备份是从buffer中找到需要备份的数据,buffer没有就到磁盘找,并调回buffer。
通过mysqldump -help可以看到其用法,下面展示常用参数
--single-transaction
用于保证innodb备份数据时的一致性,配合RR隔离级别一起使用,当发起事务时,读取一个数据的快照,知道备份结束时,都不会读取到本事务开始提交的任何数据。
--all-databasess(-A)
备份所有数据库
--master-data
该参数有1和2两个值,为1的时候,就会在备份出来的文件中添加一个CHANGE MASTER的语句(主从搭建的时候会用),为2的时候就会在备份文件中添加一个CHANGE MASTER的语句,并在语句前面欠佳注释符号(主从搭建会用到)
--dump-slave
该参数用于从库端备份数据,在线搭建新的从库时会使用,参数为1的时候会在备份文件中添加一个CHANGE MASTER,为2的时候则会在其前添加注释符号。
--no-create-info(-t)
备份时只备份表数据,不备份表结构。
--no-data(-d)
只备份表结构,不备份表数据
--complete-insert (-c)
使用完整的insert语句会包含表中的列信息,这么做可以提高插入效率。
--databases(-B)
备份多个数据库,在参数后添加数据库名即可
--default-character-set
字符集,mysql默认的为UTF8,要与备份出的表的字符集保持一致。
--quick(-q)
相当于加sql_no_query,意味着并不会读取缓存中的数据。
--where=name(-w)
按条件备份出想要的数据
1.示例:备份全库,如下
mysqldump --single-transaction --set-gtid-purged=off -uroot -p123456 -A >all_20211109.sql
加上--set-gtid-purged=off 是指关闭保存事务的gtid,不然恢复的时候会显示错误。
恢复示例,先删除test数据库,利用mysql命令恢复
上面图中把test数据库删了,在下图中使用备份将其恢复
2.示例:备份单个数据库test
mysqldump --single-transaction --setgtid-purged=off -uroot -p123456 test>test_20211109.sql
如果恢复的时候test被删掉了,要自己创建一个新的test库,如果存在直接恢复即可。
恢复则是mysql -uroot -p123456 test <test20211109.sql
3.备份数据库的单个表,示例
mysqldump --single-transaction --set-gtid-purged=off -uroot -p123456 mysql user >user_20211109.sql
恢复就不再示例了。
此外还有备份表数据,表结构,根据where条件备份数据等。与上述大同小异。
注意事项:使用mysqldump备份时,可能会出现数据库性能抖动问题,出现性能下降的情况,这是因为mysqldump备份是从buffer中找到备份的内容,如果buffer中没有,就需要访问磁盘的数据文件,然后把数据调回到内存中,形成备份文件,在磁盘调回内存时候,如果机器的内存不是很大的情况下,是会把内存中的热数据冲掉,这样业务访问数据的时候也需要从磁盘中拿数据,众所周知磁盘的性能是远小于物理内存的,这将导致数据返回时间延长,影响业务访问。
在mysql5.7后,新增了一个innodb_buffer_pool_dumo_pct参数,是用来控制每个innodb buffer中转储活跃使用innodb buffer pages的比列,只有当数据在1s内再次被访问时,才会回到热区域内,这避免了热数据被冲走的情况,默认值为25%。