mysql5.5-数据备份与恢复

一、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 </backup/liang.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   |
+----+------+

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)

猜你喜欢

转载自blog.csdn.net/liang_operations/article/details/82799762