一 MySQL 逻辑备份 mysqldump
逻辑备份特点
- 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
- 效率相对较低
1. mysqldump备份
备份库
-备份单个库
语法:
mysqldump -u用户 -p'密码' 库名 > 备份的路径/备份文件名
例如:
[root@localhost ~]# mkdir /home/back 创建备份文件存储目录 /home/back
[root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 >/home/back/db1.bk
-备份多个库
语法:
mysqldump -u用户 -p'密码' -B 数据库1 数据库2 数据库3 > 备份文件的路径/备份文件名
例如:
[root@localhost ~]# mysqldump -uroot -p'Cc@123' -B db1 db2 db3 >/home/back/db1.bk
-备份所有库
语法:
mysqldump -u用户 -p'密码' -A > 备份文件的路径/备份文件名
例如:
[root@localhost ~]# mysqldump -uroot -p'Cc@123' -A >/home/back/alldb.bk
备份表
-备份单个表
语法:
mysqldump -u用户 -p'密码' 库名 表名 > 备份的路径/备份文件名
例如:
[root@localhost ~]# mkdir /home/back 创建备份文件存储目录 /home/back
[root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 t1 >/home/back/db1.t1.bk
-备份多个表
语法:
mysqldump -u用户 -p'密码' 库名 表名1 表名2 > 备份的路径/备份文件名
例如:
[root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 t1 t2 >/home/back/db1.t1-t2.bk
2. mysqldump恢复
为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志,因为binlog使用binlog日志恢复数据时也会产生binlog日志。
-停止binlog日志
mysql> set sql_log_bin=0;
-方式一:
mysql> source 备份的路径/备份文件名
-方式二:
[root@localhost ~]# mysql -u用户 -p'密码' 库名 表名 < 备份的路径/备份文件名
恢复库
语法:
mysql -u用户 -p'密码' 库名 < 备份的路径/备份文件名
-创建一个要数据恢复到的库
mysql> create database db1;
例如:
[root@localhost ~]# mysqldump -uroot -p'Cc@123' db1
恢复表
语法:
mysql -u用户 -p'密码' 恢复到的库名 < 备份的路径/备份文件名
例如:
[root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 < /home/back/db1.t1.bk
3. 通过binlog恢复
首先应开启binlog日志
-开启binlog日志
vim /etc/my.cnf
在[mysqld]添加
log-bin=/var/log/mysql/mysql-bin # binlog日志存放位置/var/log/mysql 所有日志文件以/mysql-bin开头
server-id=1 # 用于主从复制 id号必须写
-创建binlog日志存放文件夹
[root@localhost ~]# mkdir /var/log/mysql
-给mysql用户权限
[root@localhost ~]# chown mysql.mysql /var/log/mysql
-重启mysql服务
[root@localhost ~]# systemctl restart mysql
使用binlog恢复
-分析binlog日志文件
语法:
mysqlbinlog 文件路径/文件名
例如:
mysqlbinlog /var/log/mysql/mysql-bin.000002
-使用binlog恢复
语法:
mysqlbinlog --start-position 恢复开始位置 --stop-position 恢复停止位置 文件路径/文件名 |mysql -u用户 -p'密码'
例如:
mysqlbinlog --start-position 219 --stop-position 321 /var/log/mysql/mysql-bin.000002 |mysql -uroot -p'Cc@123'
二 percona-xtrabackup 物理备份
物理备份特点
- 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,
- 但不能恢复到不同的MySQL版本。
首先必须安装xtrabackup
# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
# percona-release enable-only tools release
# yum install percona-xtrabackup -y
1. 完全备份
每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。
1.1 完全备份流程
-创建备份目录
[root@localhost ~]# mkdir /xtrabackup/full -p
-备份全部数据
语法:
innobackupex --user=用户 --password='密码' 备份文件的存储路径
例如:
[root@localhost ~]# innobackupex --user=root --password='Cc@123' /xtrabackup/full
1.2 完全备份恢复流程
1. 停止数据库
[root@localhost ~]# systemctl stop mysqld
2. 清理环境
[root@localhost ~]# rm -rf /var/lib/mysql/*
3. 重演回滚
[root@localhost ~]# innobackupex --apply-log /xtrabackup/full/完整备份
4. 恢复数据
恢复之前需要先确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里
[root@localhost ~]# cat /etc/my.cnf
确保有下列内容
[mysqld]
datadir=/var/lib/mysql
-恢复
[root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份
5. 修改权限
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
6. 启动数据库
[root@localhost ~]# systemctl start mysqld
事件回滚:就是把备份数据的时间段内产生的数据操作,转换为MySQL真正的数据文件
2. 增量备份
每次备份上一次备份到现在产生的新数据
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长
2.1 增量备份流程
首先需要对数据库进行一次完整备份,之后的每次增量备份都是参照上次的备份为依据,假如第一次的增量备份,参考的是第一次完整备份,那么第二次的增量备份,参考的是第一次的增量备份,第三次的增量备份,参考的是第二次的增量备份,依次类推...
这里的每次备份都是有相互的依赖关系的,恢复数据的时候,一个都不能少
创建增量备份首先得拥有一个完整备份
-增量备份:每次备份都以上一次备份为目录即为增量备份
语法:
innobackupex --user=用户 --password='密码' --incremental 增量备份存储位置 --incremental-basedir=完整备份文件路径
例如:
[root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/完整备份
此时/xtrabackup/full里有完整备份,增量备份1
[root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/增量备份1
此时/xtrabackup/full里有完整备份,增量备份1,增量备份2
2.2 增量备份恢复流程
首先对完整备份进行回滚操作,此时转换的数据是转换到完整备份的目录中,再依次对剩余的增量备份进行回滚操作,顺序第一次增量备份,第二次增量备份,第三次增量备份...
1. 停止数据库
[root@localhost ~]# systemctl stop mysqld
2. 清理环境
[root@localhost ~]# rm -rf /var/lib/mysql/*
3. 依次重演回滚
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/增量备份1
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/增量备份2
4. 恢复数据
[root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份
5. 修改权限
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
6. 启动数据库
[root@localhost ~]# systemctl start mysqld
3. 差异备份
只备份跟完整备份不一样的,在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。
3.1 差异备份流程
首先需要对数据库进行一次完整备份,之后的每次差异备份都是参照第一次完整备份为依据的,假如第一次的差异备份,参考的是完整备份,第二次的差异备份,参考的还是完整备份,依次类推...
这里的每次的差异备份都是独立的,但是都依赖于第一次完整备份
创建差异备份首先得拥有一个完整备份
-差异备份:每次备份都以完整备份为目录即为差异备份
语法:
innobackupex --user=用户 --password='密码' --incremental 差异备份存储位置 --incremental-basedir=完整备份文件路径
例如:
[root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/完整备份
此时/xtrabackup/full里有完整备份,差异备份1
[root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/差异备份1
此时/xtrabackup/full里有完整备份,差异备份1,差异备份2
3.2 差异备份恢复流程
首先对第一次完整备份进行回滚操作,此时转换的数据是转换到完整备份的目录中,之后可以根据实际需要选择对应时间点的差异备份,进行事件的回滚,转换的数据放到完整备份的目录中
1. 停止数据库
[root@localhost ~]# systemctl stop mysqld
2. 清理环境
[root@localhost ~]# rm -rf /var/lib/mysql/*
3. 重演回滚
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/差异备份2
4. 恢复数据
[root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份
5. 修改权限
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
6. 启动数据库
[root@localhost ~]# systemctl start mysqld
简单的讲,完整备份就是不管三七二十一,每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化;增量备份就是每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;差异备份就是每次都将第一次完整备份以来有变化的文件进行备份。