平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MySQL中数据库备份恢复的常用做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从物理与逻辑的角度,备份可分为
物理备份方法
从数据库的备份策略角度,备份可分为
物理冷备
专用备份工具mydump或mysqlhotcopy
启用二进制日志进行增量备份:进行增量备份,需刷新二进制日志
第三方工具备份:免费的MySQL热备份软件Percona XtraBackup
优点
缺点
物理冷备份与恢复
mysqldump备份与恢复
物理冷备份
[root@localhost mysql]# systemctl stop mysqld.service
[root@localhost ~]# cd /usr/local/mysql/
[root@localhost mysql]# tar zcvf /opt/mysql_all-$(date +%F).tar.gz data/
[root@localhost mysql]# cd /opt
[root@localhost opt]# ls
mysql_all-2020-08-18.tar.gz
恢复数据库
[root@localhost opt]# cd /usr/local/mysql/
[root@localhost mysql]# rm -rf data/ '删除数据库文件'
[root@localhost mysql]# mysql -uroot -p
mysql> show databases; '此时数据库文件消失'
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
[root@localhost mysql]# cd /opt
[root@localhost opt]# tar zxvf mysql_all-2020-08-18.tar.gz -C /usr/local/mysql/ '将备份的文件恢复'
[root@localhost mysql]# systemctl start mysqld.service
[root@localhost mysql]# mysql -uroot -p
mysql> show databases; '数据恢复'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydatabase |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| apple |
| mydatabase |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use mydatabase;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| mytable |
+----------------------+
1 row in set (0.00 sec)
mysql> select * from mytable;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | zhangsan | 80.00 | sh |
| 2 | lisi | 77.00 | nj |
+----+----------+-------+---------+
2 rows in set (0.00 sec)
mysqldump命令对单个库进行完全备份
mysqldump -u用户名-p [密码] [选项] [数据库名] > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase > /opt/mydatabase.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]# ls
mydatabase.sql
mysqldump命令对多个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2] ... > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --databases mydatabase apple > /opt/mydatabase-apple.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]# ls
mydatabase-apple.sql mydatabase.sql
对所有库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --all-databases > /opt/all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]# ls
all.sql mydatabase-apple.sql mydatabase.sql
mysqldump可针对库内特定的表进行备份
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
[root@localhost opt]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mydatabase.mytable.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]# ls
all.sql mydatabase.sql mydatabase-apple.sql
mydatabase.mytable.sql
采用mysqldump导出的脚本,可采用导入的方法
采用source恢复数据库的步骤
source恢复的示例
mysql > source /backup/all-data.sql
mysql> drop table mytable;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
Empty set (0.00 sec)
mysql> source /opt/mydatabase.sql
mysql> show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| mytable |
+----------------------+
1 row in set (0.00 sec)
mysql> drop database apple;
Query OK, 1 row affected (0.00 sec)
mysql> drop database mydatabase;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> source /opt/mydatabase-apple.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| apple |
| mydatabase |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
采用mysql命令恢复数据库
mysql -u 用户名 -p 密码 < 库备份脚本的路径
例:
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase-apple.sql
恢复表的操作
mysql -u 用户名 -p 密码 < 表备份脚本的路径
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase.info.sql
在生产环境里,能够采用shell脚本自动实现定时备份
采用mysqldump进行完全备份存在的问题
是自上一次备份后增加/变化的文件或者内容
特点
MySQL没有提供直接的增量备份方法
可借助MySQL提供的二进制日志间接实现增量备份
MySQL二进制日志对备份的意义
[root@localhost opt]# vim /etc/my.cnf
.......
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
log-bin=mysql-bin '添加以mysql-bin为开头的二进制文件'
server-id = 1
[root@localhost data]# ls
apple ibdata1 ibtmp1 mysql-bin.000001 '二进制日志文件'
auto.cnf ib_logfile0 mydatabase mysql-bin.index
ib_buffer_pool ib_logfile1 mysql
一般恢复:将所有备份的二进制日志内容全部恢复
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
基于位置恢复
恢复数据到指定位置
mysqlbinlog --stop-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码
从指定的位置开始恢复数据
mysqlbinlog --start-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码
基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
从日志开头截止到某个时间点的恢复
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
从某个时间点到日志结尾的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
从某个时间点到某个时间点的恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
操作前先进行完整备份
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mytable.sql
开启日志文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
log-bin=mysql-bin '开启二进制日志文件'
[root@localhost data]# systemctl restart mysqld.service
[root@localhost data]# ls
apple ibdata1 ibtmp1 mysql-bin.000001 '二进制日志文件'
auto.cnf ib_logfile0 mydatabase mysql-bin.index
ib_buffer_pool ib_logfile1 mysql
进行模拟误操作
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
+----+----------+-----+
3 rows in set (0.00 sec)
mysql> insert into mytable values (4,'zhaoliu','20'); '执行正确操作'
Query OK, 1 row affected (0.02 sec)
mysql> delete from mytable where id=1; '进行误操作'
Query OK, 1 row affected (0.00 sec)
mysql> insert into mytable values (5,'qiqi','21'); '执行正确操作'
Query OK, 1 row affected (0.01 sec)
mysql> select * from mytable;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | 20 |
| 5 | qiqi | 21 |
+----+---------+-----+
4 rows in set (0.00 sec)
进行增量备份
[root@localhost data]# mysqladmin -uroot -p123456 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
解码二进制日志文件
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 > /opt/bk01.txt
[root@localhost data]# vim /opt/bk01.txt
# at 584 '正常操作结束'
#200822 15:06:12 server id 1 end_log_pos 646 CRC32 0x591ad99d Table_map: `mydatabase`.`mytable` mapped to number 108
# at 646 '执行的误操作'
#200822 15:06:12 server id 1 end_log_pos 698 CRC32 0x4ddb56be Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `mydatabase`.`mytable`
### WHERE
### @1=1
### @2='zhangsan'
### @3='22'
# at 698 '正常操作开始'
#200822 15:06:12 server id 1 end_log_pos 729 CRC32 0x30b1bed7 Xid = 7
COMMIT/*!*/;
#200822 15:06:30 server id 1 end_log_pos 794 CRC32 0x576f94b9 Anonymous_GTID last_committed=2 sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
先删除错误的数据表,进行恢复
mysql> drop table mytable;
Query OK, 0 rows affected (0.00 sec)
mysql> source /opt/mytable.sql;
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
+----+----------+-----+
3 rows in set (0.00 sec)
采用增量备份的断点恢复
[root@localhost data]# mysqlbinlog --no-defaults --stop-position='584' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | 20 |
+----+----------+-----+
4 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --start-position='698' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | 20 |
| 5 | qiqi | 21 |
+----+----------+-----+
5 rows in set (0.00 sec)
按照增量备份中的时间点恢复
mysql> drop table mytable;
Query OK, 0 rows affected (0.00 sec)
mysql> source /opt/mytable.sql;
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
+----+----------+-----+
3 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2020-8-22 15:06:12' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | 20 |
+----+----------+-----+
4 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2020-8-22 15:06:30' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from mytable;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 22 |
| 2 | lisi | 26 |
| 3 | wangwu | 30 |
| 4 | zhaoliu | 20 |
| 5 | qiqi | 21 |
+----+----------+-----+
5 rows in set (0.00 sec)
理解这一步时,以上就是MySQL中数据库备份恢复的常用方法详解的详细内容,更多关于MySQL数据库备份恢复的资料请关注脚本之家其它相关文章!