文章目录
- 一、mysqldump的工作原理
- 二、数据库备份
- 1.备份单个数据库
- 1.1查看表数据
- 1.2备份数据库
- 1.3指定字符集备份
- 1.4指定-B备份
- 1.4指定压缩命令备份数据
- 2.分库备份
- 2.1结合awk拆分数据库
- 2.2脚本循环
- 2.3备份部分库
- 2.4备份所有库
- 3.数据库单表备份
- 3.1查看liang数据库的表
- 3.2数据库分表备份
- 三、数据恢复
- 1.source恢复数据
- 2.mysql命令恢复数据
- 2.1简单恢复
- 2.2指定-B备份的数据恢复
- 2.3指定压缩命令备份的数据恢复
- 3.分库与分表备份的恢复
- 四、mysqlbinlog增量恢复
- 1.配置binlog日志
- 2.查看binlog部分日志
- 3.使用binlog日志恢复数据
- 4.基于位置点的恢复
一、mysqldump的工作原理
- mysql数据库自带了一个很好用的备份命令,就是mysqldump。
- 它的基本使用如下:
- 语法:mysqldump -u 用户名 -p 密码 数据库名 > 备份的文件名
- 利用mysqldump命令备份数据的过程,实际上就是把数据从mysql数据库里以逻辑sql语句的形式直接输出或者生成备份文件的过程。
- 利用mysqldump命令恢复数据的过程,实际上就是把备份数据,以逻辑sql
语句的形式再数据库执行的过程。
二、数据库备份
1.备份单个数据库
- 语法:mysqldump -u 用户名 -p 密码 数据库名 > 备份的文件名
- 参数:
-A 备份所有数据库
-B 指定多个库
-F 刷新binlog日志
–compact 去掉注释,debug调试使用
–master-data 增加binlog日志文件名及对应的位置点
1.1查看表数据
mysql> use liang;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_liang |
+-----------------+
| student |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | c |
| 4 | dd |
| 5 | ee |
+----+------+
5 rows in set (0.01 sec)
1.2备份数据库
[root@mysql ~]# mkdir /backup
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock liang > /backup/liang.sql
Enter password:
[root@mysql ~]# ll /backup/liang.sql
-rw-r--r--. 1 root root 1950 9月 16 05:52 /backup/liang.sql
备份文件的主要内容
22 DROP TABLE IF EXISTS `student`;
23 /*!40101 SET @saved_cs_client = @@character_set_client */;
24 /*!40101 SET character_set_client = utf8 */;
25 CREATE TABLE `student` (
26 `id` int(4) NOT NULL AUTO_INCREMENT,
27 `name` char(20) NOT NULL,
28 PRIMARY KEY (`id`),
29 KEY `index_name` (`name`)
30 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
31 /*!40101 SET character_set_client = @saved_cs_client */;
32
33 --
34 -- Dumping data for table `student`
35 --
36
37 LOCK TABLES `student` WRITE;
38 /*!40000 ALTER TABLE `student` DISABLE KEYS */;
39 INSERT INTO `student` VALUES (1,'aa'),(2,'bb'),(3,'c'),(4,'dd'),(5,'ee');
=====》》》
mysqldump备份其实就是将数据以sql语句的形式导出
22行 ###恢复的时候会先删掉表,再创建导入数据。
1.3指定字符集备份
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock --default-character-set=utf8 liang > /backup/liang2.sql
Enter password:
[root@mysql ~]# ll /backup/liang2.sql
-rw-r--r--. 1 root root 1950 9月 16 06:02 /backup/liang2.sql
====》
--default-character-set=utf8 指定utf8字符编码导出
1.4指定-B备份
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -B liang > /backup/B-linag.sql
Enter password:
[root@mysql ~]# ll /backup/B-linag.sql
-rw-r--r--. 1 root root 2092 9月 16 06:24 /backup/B-linag.sql
内容
22 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `liang` /*!40100 DEFAULT CHARACTER SET latin1 */;
23
24 USE `liang`;
====》
这里比不加-B多出了两条sql语句,就是创建数据库与进入数据库的语句。
1.4指定压缩命令备份数据
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -B liang|gzip> /backup/B-linag.sql.gz
Enter password:
[root@mysql ~]# ll /backup/B-linag.sql.gz
-rw-r--r--. 1 root root 793 9月 16 06:34 /backup/B-linag.sql.gz
对比压缩与不压缩的文件
[root@mysql ~]# ll /backup/B-linag.sql
-rw-r--r--. 1 root root 2092 9月 16 06:24 /backup/B-linag.sql
[root@mysql ~]# ll /backup/B-linag.sql.gzip
-rw-r--r--. 1 root root 793 9月 16 06:34 /backup/B-linag.sql.gzip
====》
指定压缩命令备份比不指定的高出接近三倍的效率
2.分库备份
2.1结合awk拆分数据库
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock -e "show databases;"|egrep -vi "data|info|per"|awk '{print "mysqldump -uroot -p000000 -S /data/3306/mysql.sock -B " $0 "|gzip >/backup/"$0".sql.gz"}'
mysql -uroot -p000000 -S /data/3306/mysql.sock -B liang|gzip >/backup/liang.sql.gz
mysql -uroot -p000000 -S /data/3306/mysql.sock -B liang_gbk|gzip >/backup/liang_gbk.sql.gz
mysql -uroot -p000000 -S /data/3306/mysql.sock -B liang_utf8|gzip >/backup/liang_utf8.sql.gz
mysql -uroot -p000000 -S /data/3306/mysql.sock -B mysql|gzip >/backup/mysql.sql.gz
备份
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock -e "show databases;"|egrep -vi "data|info|per"|awk '{print "mysqldump -uroot -p000000 -S /data/3306/mysql.sock -B " $0 "|gzip >/backup/"$0".sql.gz"}'|bash
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
===============
Warning: 这是因为mysqldump默认是不备份事件表(mysql)的,解决办法 加上参数--events。
===============
查看
[root@mysql ~]# ll /backup/
总用量 156
-rw-r--r--. 1 root root 514 9月 16 07:56 liang_gbk.sql.gz
-rw-r--r--. 1 root root 513 9月 16 07:56 liang.sql.gz
-rw-r--r--. 1 root root 512 9月 16 07:56 liang_utf8.sql.gz
-rw-r--r--. 1 root root 144243 9月 16 07:56 mysql.sql.gz
2.2脚本循环
[root@mysql ~]# cat sql.backup.sh
#!/bin/bash
user=root
passwd=000000
sock=/data/3306/mysql.sock
Bin=/application/mysql/bin/
List=`${Bin}mysql -u${user} -p${passwd} -S ${sock} -e "show databases;"|egrep -vi "data|info|per"`
for num in `echo $List`
do
${Bin}mysqldump -p${passwd} -S ${sock} --events -B ${num}|gzip >/backup/`date +%F`${num}.sql.gz
done
[root@mysql ~]# bash sql.backup.sh
[root@mysql ~]# ll /backup/2018*
-rw-r--r--. 1 root root 535 9月 16 08:13 /backup/2018-09-16liang_gbk.sql.gz
-rw-r--r--. 1 root root 533 9月 16 08:13 /backup/2018-09-16liang.sql.gz
-rw-r--r--. 1 root root 533 9月 16 08:13 /backup/2018-09-16liang_utf8.sql.gz
-rw-r--r--. 1 root root 144274 9月 16 08:13 /backup/2018-09-16mysql.sql.gz
2.3备份部分库
语法:mysqldump -u用户 -p密码 -B 库名 库名 .. . >备份的文件名
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -B liang liang_gbk liang_utf8|gzip >/backup/liang.al.gz
[root@mysql ~]# ll /backup/liang.sql.gz
-rw-r--r--. 1 root root 513 9月 16 07:56 /backup/liang.sql.gz
2.4备份所有库
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock -A -B |gzip >/backup/all.sql.gz
[root@mysql ~]# ll /backup/all.sql.gz
-rw-r--r--. 1 root root 144476 9月 20 13:49 /backup/all.sql.gz
3.数据库单表备份
语法:mysqldump -u用户名 -p密码 数据库名 表名 > 备份的文件名
例: mysqldump -uroot -p000000 liang student > /backup/liang_student.sql
参数:
-d 只备份表结构
-t 只备份表数据
-x 锁表
-l 只读锁表
--single-transaction 适合innodb事物数据库备份,
==========================
不能加-B 参数
=============================
3.1查看liang数据库的表
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e"use liang;show tables;"
Enter password:
+-----------------+
| Tables_in_liang |
+-----------------+
| liang |
| student |
| student01 |
| student02 |
+-----------------+
备份
[root@mysql ~]# mysqldump -uroot -p -S /data/3306/mysql.sock liang student|gzip >/backup/liang_student.sql.gz
Enter password:
[root@mysql ~]# ll /backup/liang_student.sql.gz
-rw-r--r--. 1 root root 664 9月 20 13:51 /backup/liang_student.sql.gz
3.2数据库分表备份
awk方式
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock -e"use liang;show tables;"|grep -v "Tables_in_liang"|awk '{print "mysqldump -uroot -p000000 -S /data/3306/mysql.sock liang "$0"|gzip > /backup/`date +%F`-liang-"$0"sql.gz"}'|bash
[root@mysql ~]# ll /backup/2018-09-20-liang-*
-rw-r--r--. 1 root root 661 9月 20 13:58 /backup/2018-09-20-liang-liangsql.gz
-rw-r--r--. 1 root root 668 9月 20 13:58 /backup/2018-09-20-liang-student01sql.gz
-rw-r--r--. 1 root root 668 9月 20 13:58 /backup/2018-09-20-liang-student02sql.gz
-rw-r--r--. 1 root root 664 9月 20 13:58 /backup/2018-09-20-liang-studentsql.gz
三、数据恢复
1.source恢复数据
mysql> show tables;
+-----------------+
| Tables_in_liang |
+-----------------+
| liang |
| student |
| student01 |
| student02 |
+-----------------+
4 rows in set (0.00 sec)
mysql> drop table liang;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table student;
Query OK, 0 rows affected (0.02 sec)
恢复数据
mysql> source /backup/all.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
....
...
..
mysql> show tables;
+-----------------+
| Tables_in_liang |
+-----------------+
| liang |
| student |
| student01 |
| student02 |
+-----------------+
4 rows in set (0.00 sec)
2.mysql命令恢复数据
2.1简单恢复
删除student表
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "use liang;drop table student;"
恢复数据
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock liang
2.2指定-B备份的数据恢复
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "use liang;drop table student;"
Enter password:
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock < /backup/B-linag.sql
Enter password:
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "use liang;select * from student;"
Enter password:
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | c |
| 4 | dd |
| 5 | ee |
+----+------+
====》
指定-B备份的数据库,恢复时不需要指定数据库,因为它会自动创建并进入该库。
2.3指定压缩命令备份的数据恢复
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "use liang;drop table student;"
Enter password:
[root@mysql ~]# gunzip < /backup/B-linag.sql.gz | mysql -uroot -p -S /data/3306/mysql.sock
Enter password:
[root@mysql ~]# mysql -uroot -p -S /data/3306/mysql.sock -e "use liang;select * from student;"
Enter password:
+----+------+
| id | name |
+----+------+
| 1 | aa |
| 2 | bb |
| 3 | c |
| 4 | dd |
| 5 | ee |
+----+------+
3.分库与分表备份的恢复
库与表数据恢复的方法一样,下面以表为例恢复数据
mysql> show tables;
+-----------------+
| Tables_in_liang |
+-----------------+
| liang |
| student |
| student01 |
| student02 |
+-----------------+
4 rows in set (0.00 sec)
删除所有表
mysql> drop table liang;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table student01;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table student02;
Query OK, 0 rows affected (0.00 sec)
恢复
[root@mysql backup]# ll 2018-09-20*
-rw-r--r--. 1 root root 661 9月 20 13:58 2018-09-20-liang-liangsql.gz
-rw-r--r--. 1 root root 668 9月 20 13:58 2018-09-20-liang-student01sql.gz
-rw-r--r--. 1 root root 668 9月 20 13:58 2018-09-20-liang-student02sql.gz
-rw-r--r--. 1 root root 664 9月 20 13:58 2018-09-20-liang-studentsql.gz
[root@mysql backup]# ls 2018-09-20*|tr "\t" "\n"|awk '{print "gunzip < "$0"|mysql -uroot -p000000 -S /data/3306/mysql.sock liang"}'
gunzip < 2018-09-20-liang-liangsql.gz|mysql -uroot -p -S /data/3306/mysql.sock liang
gunzip < 2018-09-20-liang-student01sql.gz|mysql -uroot -p -S /data/3306/mysql.sock liang
gunzip < 2018-09-20-liang-student02sql.gz|mysql -uroot -p -S /data/3306/mysql.sock liang
gunzip < 2018-09-20-liang-studentsql.gz|mysql -uroot -p -S /data/3306/mysql.sock liang
[root@mysql backup]# ls 2018-09-20*|tr "\t" "\n"|awk '{print "gunzip < "$0"|mysql -uroot -p000000 -S /data/3306/mysql.sock liang"}'|bash
查看
mysql> show tables;
+-----------------+
| Tables_in_liang |
+-----------------+
| liang |
| student |
| student01 |
| student02 |
+-----------------+
4 rows in set (0.00 sec)
四、mysqlbinlog增量恢复
- mysql的bin-log日志会记录mysql内部对mysql数据库所有增删改等更新的内容的记录
- mysql的binlog日志需要用mysqlbinlog查看。
1.配置binlog日志
[root@mysql ~]# egrep "mysqld|log-bin" /data/3306/my.conf
[mysqld]
log-bin = /data/3306/mysql-bin
删除数据库
mysql> drop database liang_gbk;
Query OK, 0 rows affected (0.01 sec)
mysql> drop database liang_utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> drop database liang;
Query OK, 4 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
重启
[root@mysql ~]# /data/3306/mysqld restart
mysql 3306 stop...... [确定]
mysql 3306 start...... [确定]
恢复数据,binlog会记录
mysql> source /backup/all01.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
...
..
查看binlog文件
[root@mysql ~]# ll /data/3306/mysql-bin.*
-rw-rw----. 1 mysql mysql 107 9月 20 19:50 /data/3306/mysql-bin.000001###binlog日志
-rw-rw----. 1 mysql mysql 28 9月 20 19:50 /data/3306/mysql-bin.index###binlog日志的索引
2.查看binlog部分日志
26 # at 260
27 #180920 19:56:53 server id 1 end_log_pos 378 Query thread_id=1 exec_time=0 error_code=0
28 use `liang`/*!*/;
29 SET TIMESTAMP=1537487813/*!*/;
30 DROP TABLE IF EXISTS `liang` /* generated by server */
31 /*!*/;
32 # at 378
33 #180920 19:56:53 server id 1 end_log_pos 580 Query thread_id=1 exec_time=1 error_code=0
34 SET TIMESTAMP=1537487813/*!*/;
35 CREATE TABLE `liang` (
36 `id` int(4) NOT NULL,
37 `name` char(10) DEFAULT NULL,
38 PRIMARY KEY (`id`)
39 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
40 /*!*/;
41 # at 580
42 #180920 19:56:54 server id 1 end_log_pos 688 Query thread_id=1 exec_time=0 error_code=0
43 SET TIMESTAMP=1537487814/*!*/;
44 /*!40000 ALTER TABLE `liang` DISABLE KEYS */
45 /*!*/;
46 # at 688
47 #180920 19:56:54 server id 1 end_log_pos 795 Query thread_id=1 exec_time=0 error_code=0
48 SET TIMESTAMP=1537487814/*!*/;
49 /*!40000 ALTER TABLE `liang` ENABLE KEYS */
50 /*!*/;
51 # at 795
52 #180920 19:56:54 server id 1 end_log_pos 915 Query thread_id=1 exec_time=0 error_code=0
53 SET TIMESTAMP=1537487814/*!*/;
54 DROP TABLE IF EXISTS `student` /* generated by server */
55 /*!*/;
56 # at 915
57 #180920 19:56:54 server id 1 end_log_pos 1119 Query thread_id=1 exec_time=0 error_code=0
58 SET TIMESTAMP=1537487814/*!*/;
59 CREATE TABLE `student` (
60 `id` int(4) NOT NULL,
61 `name` char(10) DEFAULT NULL,
62 PRIMARY KEY (`id`)
63 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
64 /*!*/;
3.使用binlog日志恢复数据
3.1拆库恢复数据
binlog会记录所有库的增删查改记录,有时我们只想恢复单个数据库
就需要拆库恢复数据库
删除liang数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liang |
| liang_gbk |
| liang_utf8 |
| mysql |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)
mysql> drop database liang;
恢复
[root@mysql ~]# mysqlbinlog -d liang /data/3306/mysql-bin.000001 >/backup/liang.sql
[root@mysql ~]# cat -n /backup/liang.sql|grep "drop"
130 drop database liang
[root@mysql ~]# sed -i '/^drop/d' /backup/liang.sql
================
-d 拆库
因为删除的命令也被记录了,所有需要将删除的命令删掉再恢复
================
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock < /backup/liang.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liang |
| liang_gbk |
| liang_utf8 |
| mysql |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)
4.基于位置点的恢复
mysql> use liang;
Database changed
mysql> create table student03(
-> id int(4) PRIMARY KEY,
-> name char(4)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into student03 (name) values ("aa");
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from student03;
+----+------+
| id | name |
+----+------+
| 0 | aa |
+----+------+
1 row in set (0.00 sec)
4.1指定开始和结束位置
mysql> drop table student03;
Query OK, 0 rows affected (0.00 sec)
找到创建student03表的地方
244 # at 5175
245 #180920 20:16:13 server id 1 end_log_pos 5300 Query thread_id=1 exec_time=0 error_code=0
246 SET TIMESTAMP=1537488973/*!*/;
247 SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
248 SET @@session.sql_mode=0/*!*/;
249 create table student03(
250 id int(4) PRIMARY KEY,
251 name char(4)
252 )
253 /*!*/;
254 # at 5300
255 #180920 20:16:50 server id 1 end_log_pos 5369 Query thread_id=1 exec_time=0 error_code=0
256 SET TIMESTAMP=1537489010/*!*/;
257 BEGIN
258 /*!*/;
259 # at 5369
260 #180920 20:16:50 server id 1 end_log_pos 5475 Query thread_id=1 exec_time=0 error_code=0
261 SET TIMESTAMP=1537489010/*!*/;
262 insert into student03 (name) values ("aa")
263 /*!*/;
264 # at 5475
265 #180920 20:16:50 server id 1 end_log_pos 5502 Xid = 139
266 COMMIT/*!*/;
267 # at 5502
恢复数据
[root@mysql ~]# mysqlbinlog /data/3306/mysql-bin.000001 --start-position=5175 --stop-position=5475 -r /backup/bin.sql
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock < /backup/bin.sql
mysql> select * from student03;
+----+------+
| id | name |
+----+------+
| 0 | aa |
+----+------+
1 row in set (0.00 sec)
===========================
注意:结尾的日志点比较特殊,不会被包含,5175pos的binlog。
位置点信息要实际存在,不能乱指定
不指定开始表示从日志第一行开始恢复
不指定结尾则表示恢复到日志结尾一行
====================================================
4.2指定时间恢复
[root@mysql ~]# mysqlbinlog /data/3306/mysql-bin.000001 --start-datetime='2018-09-20 20:16:13' --stop-datetime='2018-09-20 20:16:50' -r /backup/date.sql
mysql> drop table student03;
Query OK, 0 rows affected (0.01 sec)
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock < /backup/date.sql
mysql> select * from student03;
+----+------+
| id | name |
+----+------+
| 0 | aa |
+----+------+
1 row in set (0.00 sec)