mysql备份
mysql备份讲解
1.1 备份的作用
论数据的重要性
1.2 如何实现备份?都有哪些方法可以实现数据的备份?
bin-log
使用二进制日志的方式进行备份,主要实现过程通过实现mysql的主从备份即可
备注:建议将bin-log实时备份至远程服务器中,以防机器故障而导致日志丢失
mysqldump
mydumper
Xtrabackup
1.mysqldump
一、mysqldump 简介
mysqldump
是 MySQL
自带的逻辑备份工具。
它的备份原理是通过协议连接到 MySQL
数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert
语句,当我们需要还原这些数据时,只要执行这些 insert
语句,即可将对应的数据还原。
常用参数说明:
1 | --version, -V 输出mysqldump版本信息并退出 |
二、备份命令
2.1 命令格式
1 | mysqldump [选项] 数据库名 [表名] > 脚本名 |
或
1 | mysqldump [选项] --数据库名 [选项 表名] > 脚本名 |
或
1 | mysqldump [选项] --all-databases [选项] > 脚本名 |
命令格式:
1 | mysqldump -uroot -p -A >/mysqlback/mysql_all.sql |
作用:
将数据库所有内容备份至/root下,并设置文件名为mysql_all.sql
2.2 选项说明
参数名 | 缩写 | 含义 |
---|---|---|
–host | -h | 服务器IP地址 |
–port | -P | 服务器端口号 |
–user | -u | MySQL 用户名 |
–pasword | -p | MySQL 密码 |
–databases | -B | 指定要备份的数据库 |
–all-databases | -A | 备份mysql服务器上的所有数据库 |
–compact | 压缩模式,产生更少的输出 | |
–comments | -i | 添加注释信息 |
–complete-insert | -c | 输出完成的插入语句 |
–lock-tables | -l | 备份前,锁定所有数据库表 |
–no-create-db/–no-create-info | 禁止生成创建数据库语句 | |
–force | -f | 当出现错误时仍然继续备份操作 |
–default-character-set | 指定默认字符集 | |
–add-locks | 备份数据库表时锁定数据库表(默认开启) | |
–where | -w | 导出时,在后方添加条件语句,只导出符合条件的数据 |
–xml | -x | 导出时,将数据格式转换为XML |
–flush-logs | -F | 开始导出之前刷新bin-log日志。 |
备注:如果一次导出多个库,将会多次刷新bin-log,只有在同时使用–lock-all-tables或者–master-data才不会出现类似情况
2.3 实例
备份所有数据库:
1 | mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db |
备份指定数据库:
1 | mysqldump -uroot -p -B test > /backup/mysqldump/test.db |
备份指定数据库指定表(多个表以空格间隔)
1 | mysqldump -uroot -p mysql db event > /backup/mysqldump/2table.db |
备份指定数据库排除某些表
1 | mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.db |
导出复合条件的库
1 | mysqldump -uroot -p -B db_name --where="user='root'" |
三、还原命令
3.1 系统行命令
1 | mysqladmin -uroot -p create db_name |
3.2 soure 方法
1 | mysql > use db_name |
增量备份
以上备份均为全备方式,如果要实现增量备份,最简单的方法是通过mysqldump配合bin-log来实现
实现原理:通过mysqldump命令中配合使用–flush-logs -F参数,每次全备后都刷新一次bin-log
在全备后新的操作都将被记录到新的bin-log中,故而实现增量备份
过程如下:
先开启 log-bin=mysql-bin
server-id=1 然后重启,
第一次全备:
1 | mkdir /myback |
第一次全备 然后有新的binlog日志了
1 | mysqldump -uroot -p -B m2 -F >/myback/all.sql |
然后再次插入数据
1 | mysql >insert into m2.a values (3,'wangwu','f'); |
将最新的log-bin备份
1 | cp /var/lib/mysql-bin.000002 /myback |
删除测试库
1 | drop database m2; |
恢复全备
1 | mysql -p </myback/all.sql |
查看
1 | mysql > select * from m2.a; |
恢复增备
1 | mysqlbinlog /myback/mysql-bin.000002 |mysql -p |
再次查看
1 | myslq -e -p select * from m2.a; |
也可以直接通过备份bin-log来实现全量和增量备份,通过下列命令可以从指定位置恢复:
1、通过bin-log起始位置恢复
1 | mysqlbinlog --start-position=4 --stop-position=798 mysql_bin.000001|mysql -uroot -p |
2、通过bin-log中记录时间恢复
1 | mysqlbinlog --start-datetime='2018-09-20 00:00:00' --stop-datetime='2018-09-31 12:00:00' mysql_bin.000001|mysql -uroot -p |
2.mydumper备份
Mydumper是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具。
官网
1 | https://launchpad.net/mydumper |
Mydumper主要特性:
轻量级C语言写的
多线程备份,备份后会生成多个备份文件
事务性和非事务性表一致的快照(适用于0.2.2以上版本)
快速的文件压缩
支持导出binlog
多线程恢复(适用于0.2.1以上版本)
以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
开源 (GNU GPLv3)
1、mydumper安装
安装依赖
1 |
|
下载源码包
1 | 0.97版本 |
开始编译安装
1 | cd mydumper/ |
在当前目录看到这两个文件就表示搞定了,创建软连接或者设置环境变量
2.1、mydumper常用参数说明
1 | -B, --database 要备份的数据库,不指定则备份所有库 |
注意:该命令**-u** 选项和后面的用户名必须有一个以上空格,否则将会报错
2.2 myloader 参数解释
1 | -d, --directory 备份文件的文件夹 |
备份 yichen 库 到 /data/backup/mysql 文件夹中
1 | mydumper -u root -p '123.Shui!!' -P 3306 -h 127.0.0.1 -B yichen -o /data/backup/mysql/ |
从上面可以可以看出
备份所生成的文件
目录中包含一个metadata文件
- 记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,
- 如果是在从库进行备份,还会记录备份时同步至主库的二进制日志文件及写入位置
每个表有两个备份文件: - database.table-schema.sql 表结构文件
- database.table.sql 表数据文件
恢复 beta 库
1 | # 删除 beta 库 |
备份原理
1、主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,保证数据的一致性
2、读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
3、N个(线程数可以指定,默认是4)dump线程把事务隔离级别改为可重复读 并开启读一致的事物
4、dump non-InnoDB tables, 首先导出非事物引擎的表
5、主线程 UNLOCK TABLES 非事物引擎备份完后,释放全局只读锁
6、dump InnoDB tables, 基于事物导出InnoDB表
7、事物结束
3.xtrabackup 备份恢复
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabackup有2个工具,分别是xtrabakup、innobakupe。8.0只有xtrabkup了。
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
xtrabackup和innobackupex两者间的区别:
xtrabackup可以对innodb表进行热备份(不对表加锁,备份期间数据可读写),但不能对myisam表进行备份;
innobackupex可以同时对上面两者进行备份,但针对myisam表依旧不能进行热备份(必须加锁后方能备份)
重要
版本8.0.6中添加了对MyRocks存储引擎的支持。
Percona XtraBackup 8.0不支持TokuDB存储引擎。
二、Xtrabackup优点
(1)备份速度快,物理备份可靠
(2)备份过程不会打断正在执行的事务(无需锁表)
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动备份校验
(5)还原速度快
(6)可以流传将备份传输到另外一台机器上
(7)在不增加服务器负载的情况备份数据
官方文档
1 | https://www.percona.com/doc/percona-xtrabackup/8.0/index.html |
下载地址(mysql8.0之前的最好下载2.4的版本。)
2.4的安装
1 | cd /root/ && wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz |
8.0的安装
1 | https://www.percona.com/downloads/Percona-XtraBackup-LATEST/ |
安装依赖
1 | yum install libaio libaio-devel -y |
可以通过yum源来安装
1 | yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm |
启用存储库:
percona-release enable-only tools release
如果打算将Percona XtraBackup与上游MySQL Server结合使用,则只需启用
tools
存储库:。percona-release enable-only tools
通过运行以下命令安装Percona XtraBackup:
yum install percona-xtrabackup-80
警告
在CentOS 6上libev
安装Percona XtraBackup之前,请确保已安装软件包。对于此操作系统,libev
可从EPEL存储库中获得该 软件包。
为了能够进行压缩备份,请安装qpress
软件包:
1 | yum install qpress |
1.Xtrabackup 常用参数
1 | -H, --host=name 该选项表示备份数据库的地址默认是本地 |
xtarbackup备份命令格式:
备份:
Xtrabackup全备
1 | xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/backup/mysql/ -uroot --port=3306 -S /usr/local/mysql/data/mysql.sock -p'123.Shui!!' |
备份好会生成相关文件
全备完成
各文件说明:
(1)xtrabackup_checkpoints 备份类型(如完全或增量)、备份状态(如是否已经为 prepared 状态)和 LSN(日志序列号)范围信息; 每个 InnoDB 页(通常为 16k 大小)都会包含一个日志序列号,即 LSN。LSN 是整个数据库
系统的系统版本号,每个页面相关的 LSN 能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info mysql 服务器当前正在使用的二进制日志文件及至备份 这一刻为止二进制日志事件的位置。
(3) xtrabackup_binlog_pos_innodb 二进制日志文件及用于InnoDB或XtraDB表的二进 制日志文件的当前 position。
(4) xtrabackup_binary 备份中用到的 xtrabackup 的可执行文件;
(5)backup-my.cnf 备份命令用到的配置选项信息; 在使用 innobackupex 进行备份时,还可以使用–no-timestamp 选项来阻止命令自动创建 一个以时间命名的目录;如此一来,innobackupex 命令将会创建一个 BACKUP-DIR 目录 来存储备份数据 注意:相关选项说明: 其中, –user 指定连接数据库的用户名, –password 指定连接数据库的密码, –defaults-file 指定数据库的配置文件,innobackupex 要从其中获取 datadir 等信息;–database 指定要 备份的数据库,这里指定的数据库只对 MyISAM 表有效,对于 InnoDB 数据来说都是全 备(所有数据库中的 InnoDB 数据都进行了备份,不是只备份指定的数据库,恢复时也 一样);/opt/mysqlbackup/full 是备份文件的存放位置。
注意:备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份, 则可基于如下命令创建此类用户:
1 | create user 'bkpuser'@'localhost' identified mysql_native_password by '123.shui!!@#'; |
全备恢复
模拟数据丢失环境
停止
1 | systemctl stop mysqld |
如果尝试使用这些数据文件启动InnoDB,它将检测到损坏并停止工作,以避免在损坏的数据上运行。该--prepare
步骤可以使文件在单个时刻完美地保持一致,因此您可以在文件上运行 InnoDB。
该准备步骤使用这种“嵌入式InnoDB的”对复制的数据文件执行崩溃恢复,使用复制的日志文件。该prepare
步骤的使用非常简单:您只需使用选项运行xtrabackup--prepare
并告诉它要准备的目录,例如,准备先前进行的备份运行:
恢复前准备(初始化备份目录)
1 | xtrabackup --prepare --target-dir=/data/backup/mysql/ |
恢复备份
警告
必须先准备好备份,然后才能还原它。
为方便起见,xtrabackup二进制文件具有将--copy-back
备份复制到服务器的数据目录的选项:
1 | xtrabackup --datadir=/usr/local/mysql/data --copy-back --target-dir =/data/backup/mysql/ |
如果您不想保存备份,则可以使用 --move-back
将备份数据移动到datadir的选项。
如果不想使用以上任何选项,则可以另外使用 rsync或cp来还原文件。
注意
恢复备份之前,datadir必须为空。同样重要的是要注意,在执行还原之前需要关闭MySQL服务器。您不能还原到正在运行的mysqld实例的数据目录(导入部分备份时除外)。
可用于还原备份的rsync命令示例如下所示:
1 | rsync -avrP /data/backup/mysql/ /usr/local/mysql/data/ |
您应该检查恢复的文件是否具有正确的所有权和权限。
由于将保留文件的属性,因此在大多数情况下,mysql
在启动数据库服务器之前,您需要将文件的所有权更改为,因为它们将由创建备份的用户拥有:
1 | chown -R mysql:mysql /usr/local/mysql/data/ |
现在,数据已还原,您可以启动服务器。
1 | systemctl start mysqld |
增量备份
要进行增量备份,请像往常一样从完整备份开始。该 xtrabackup二进制写入一个名为xtrabackup_checkpoints
到备份的目标目录。该文件包含一行,显示 to_lsn
,这是备份结束时数据库的LSN。 使用以下命令创建完整备份:
1 |
|
查看xtrabackup_checkpoints文件
1 | cat /data/backup/mysql/xtrabackup_checkpoints |
第一次增量备份
1 | 增量备份时两个参数的说明: |
现在您已拥有完整备份,您可以基于它进行增量备份。使用以下命令:(先模拟新插入数据)
1 | xtrabackup --backup --target-dir=/data/backup/mysqlinc/inc1 --incremental-basedir=/data/backup/mysql/ -uroot -p'123.Shui!!' |
查看新的xtrabackup_checkpoints文件
1 | cat /data/backup/mysqlinc/inc1/xtrabackup_checkpoints |
from_lsn
是备份的开始LSN,对于增量备份,它必须to_lsn
与先前/基本备份的相同(如果是最后一个检查点)。
第二次增量备份
现在可以使用此目录作为另一个增量备份的基础:
1 | xtrabackup --backup --target-dir=/data/backup/mysqlinc/inc2 \ |
此文件夹还包含xtrabackup_checkpoints
:查看信息
1 | cat /data/backup/mysqlinc/inc2/xtrabackup_checkpoints |
全量恢复(全备+增备)
模拟数据丢失环境
1 | systemctl stop mysqld |
恢复前准备(初始化备份目录)
增量备份的步骤与完全备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务相对于数据文件从日志文件中重放,未提交的事务被回滚。准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一次增量备份中提交。您应该使用该 --apply-log-only
选项来防止回滚阶段。
警告
如果不使用该 选项阻止回滚阶段,则增量备份将无用。事务回滚后,不能再应用增量备份。--apply-log-only
从创建的完整备份开始,您可以准备它,然后将增量差异应用于它。回想一下,您有以下备份:
1 | /data/backup/mysql |
要准备基本备份,您需要--prepare
照常运行,但要防止回滚阶段:
1 | xtrabackup --prepare --apply-log-only --target-dir=/data/backup/mysql |
输出应以类似于以下内容的文本结尾:
1 | Shutdown completed; log sequence number 18566229 |
日志序列号应与to_lsn
您先前看到的基本备份的序列号匹配。
要将第一个增量备份应用于完整备份,请运行以下命令:
1 | xtrabackup --prepare --apply-log-only --target-dir=/data/backup/mysql --incremental-dir=/data/backup/mysqlinc/inc1 |
Percona XtraBackup不支持使用相同的增量备份目录来准备备份的两个副本。不要--prepare
使用相同的增量备份目录(–incremental-dir的值)运行超过一次。
准备第二个增量备份是一个类似的过程:将增量应用到(已修改的)基础备份,您将及时将其数据前滚到第二个增量备份的点:
1 | xtrabackup --prepare --target-dir=/data/backup/mysql \ |
注意
--apply-log-only
合并除最后一个以外的所有增量时应使用。这就是为什么上一行不包含该 --apply-log-only
选项的原因。即使--apply-log-only
在最后一步中使用了,备份仍将保持一致,但在这种情况下,服务器将执行回滚阶段。
一旦准备好增量备份就与完整备份相同,可以用相同的方式还原它们。
拷贝全备目录下所有内容到数据目录中(此时的全备目录已经拥有全量数据)
用于还原备份的rsync命令示例如下所示:
1 | rsync -avrP /data/backup/mysql/ /usr/local/mysql/data/ |
授权
1 | chown -R mysql:mysql /usr/local/mysql/data/ |
现在,数据已还原,可以启动服务器查看。
1 | systemctl start mysqld |
增量恢复完成
公司备份实战
1 | 创建备份目录 |
现在可以使用此目录作为另一个增量备份的基础:
1 | xtrabackup --backup --target-dir=/mysqlbackup/zengliang/$(date "+%Y-%m-%d") --incremental-basedir=/mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` -uroot -H 192.168.224.11 -p'123.Shui!!' |
第二次增量备份
1 | xtrabackup --backup --target-dir=/mysqlbackup/zengliang/$(date "+%Y-%m-%d") --incremental-basedir=/mysqlbackup/zengliang/$(date "+%Y-%m-%d") -uroot -H 192.168.224.11 -p'123.Shui!!' |
备份脚本
vim mysqlbackup.sh
1 | #!/bin/bash |
先修改/etc/my.cnf 文件,打开log-bin=mysql-bin
server-id=1
开始访问定时任务每天早上8点进行备份
1 | crontab -e |
模拟周二数据删除后恢复
1 | systemctl stop mysqld |
恢复前准备(初始化备份目录)
初始化全备
1 | xtrabackup --prepare --apply-log-only --target-dir=/mysqlbackup/wanquan/0/ |
初始化周一的增量备份
1 | xtrabackup --prepare --apply-log-only --target-dir=/mysqlbackup/wanquan/0/ --incremental-dir=/mysqlbackup/zengliang/1 |
初始化周二的增量备份
1 | xtrabackup --prepare --target-dir=/mysqlbackup/wanquan/0/ --incremental-dir=/mysqlbackup/zengliang/2 |
拷贝全备目录下所有内容到数据目录中(此时的全备目录已经拥有全量数据)
1 | cp -a /mysqlbackup/wanquan/0/* /usr/local/mysql/data/ |
授权
1 | chown -R mysql:mysql /usr/local/mysql/data/ |
启动
1 | systemctl start mysqld |
此时数据已经恢复成功。
2.innobackupex 常用参数(2.4版本)
mysql不能高于5.7版本。
1 | --apply-log 恢复时,通过xtrabackup_logfile在备份目录中创建一个备份(恢复备份时必选) |
使用案例:
备份最好不要用root用户,需要新建用户
1 | create user 'backup_mysql'@'%' identified with mysql_native_password by '123.Shui!!@#'; |
开始备份
1 | mkdir /mysqlbackup/{wanquan,zengliang} -p |
1 | innobackupex --defaults-file=/etc/my.cnf --user=backup_mysql --password=123.Shui!!@# /mysqlbackup/wanquan/$(date "+%Y-%m-%d") --no-timestamp |
$(date “+%Y-%m-%d”) #表示已今天日期命名 这样备份会多创建一个目录,所以需要加一个参数 –no-timestamp 告诉innobackupex不要创建一个时间戳目录来存储备份
停止数据库
测试,删除一个表或库,模拟误操作或者直接删除数据库数据目录
1 | rm /usr/local/mysql/data/* -rf |
恢复前准备(初始化数据)
1 | innobackupex --defaults-file=/etc/my.cnf --apply-log /mysqlbackup/wanquan/$(ls /mysqlbackup/wanquan/) |
恢复数据到数据目录中;–datadir 指定数据目录位置,如果配置文件中有指定,则不需要在此指定
1 | innobackupex --defaults-file=/etc/my.cnf --copy-back --datadir=/usr/local/mysql/data /mysqlbackup/wanquan/$(ls /mysqlbackup/wanquan/) |
给目录授权
1 | chown -R mysql.mysql /usr/local/mysql/data/ |
启动数据库
1 | systemctl start mysqld |
全备及全备恢复完成!
innobackupex 增量备份
已经初始化的全备目录的数据不能再做为增量备份的基础数据,下面需要增量备份,所以这里需要重新备份,
全备
1 | innobackupex --defaults-file=/etc/my.cnf --user=backup_mysql --password=123.Shui!!@# /mysqlbackup/wanquan/$(date "+%Y-%m-%d") --no-timestamp |
新增数据
1 | mysql -p -e 'create database b; use b;create table b1 (id int);show tables;' |
第一次增量备份
1 | innobackupex --incremental /mysqlbackup/zengliang/$(date "+%Y-%m-%d") --incremental-basedir=/mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` --user=backup_mysql --password=123.Shui!!@# --no-timestamp |
–incremental-basedir 指定全量备份目录,因为增量备份需要知道前一次全量是到哪里结束的
–incremental 指定增量备份的目录,会在指定目录下创建一个以当前日期和时间命名的
再次新增数据
1 | 创建C 库 |
第二次增量备份
目录日期不一样,还有–incremental=basedir= 指定的目录是第一次增量备份的目录
1 | innobackupex --incremental /mysqlbackup/zengliang/$(date "+%Y-%m-%d-%H") --incremental-basedir=/mysqlbackup/zengliang/`ls /mysqlbackup/zengliang/` --user=backup_mysql --password=123.Shui!!@# --no-timestamp |
增量备份完成!
增量备份恢复
1 | systemctl stop mysqld |
初始化全备目录
1 | innobackupex --apply-log --redo-only /mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` |
查看有多少增量备份目录
ls /mysqlbackup/zengliang/
初始化第一次增备目录
1 | innobackupex --apply-log --redo-only /mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` --incremental-dir=/mysqlbackup/zengliang/2019-10-16 |
把增量备份的数据整合到全备了
初始化第二次增备目录(注意:这一步不需要加 –redo-only 选项)最后一次不需要加
1 | innobackupex --apply-log /mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` --incremental-dir=/mysqlbackup/zengliang/2019-10-17-23 |
开始完整恢复
1 | innobackupex --copy-back /mysqlbackup/wanquan/`ls /mysqlbackup/wanquan/` |
过程:先将两次增量备份所备份的数据整合到全备目录中,然后进行一次性恢复
重新授权
1 | chown -R mysql.mysql /usr/local/mysql/data/ |
启动数据库
1 | systemctl start mysqld |
至此,innobackupex 增量备份与恢复完成!
- 本文标题:mysql备份
- 本文作者:yichen
- 本文链接:https://yc6.cool/2020/08/03/mysql备份/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!