mysql备份和还原

mysql备份和还原

备份容易,还原难。一般情况,都是没事备份,出事还原。

备份:给数据创建一个数据副本,在出现任何数据故障时,保证数据不丢失。

RAID1,RAID10,是在硬件上保证数据备份,但是在逻辑上,并不能进行数据备份,比如:执行了DORP命令,RAID备份的数据也会丢失。

备份类型:

  • 根据服务器是否可在线:

  1. 热备份:服务器在线备份,读写操作可继续进行,事务处理的同时进行备份

  2. 温备份:服务器在线备份,可以执行读操作,不可以写

  3. 冷备份:服务器离线备份,读写操作均不可进行

  • 根据不同层面的备份:

  1. 物理备份:直接备份数据文件,复制操作,速度快,不需要mysql进程处理。

  2. 逻辑备份:将数据导出至文本文件,必要时候可以进行还原,速度比较慢,需要mysql进程参与,逻辑备份可能丢失数据精度(浮点数),对文本文件的操作比较简单,可移植能力强。

  • 根据备份集:(备份策略:完全+增量 或者 完全+差异)

  1. 完全备份:备份整个数据集(以库为单位)

  2. 增量备份:只对上次完全备份(包括增量备份)变化以后的数据

  3. 差异备份:仅仅备份上次完全备份以来,变化的数据

备份结束,一定要作还原!!!

备份的对象:

  1. 数据

  2. 配置文件:运行特性发生变化也可能导致数据无法还原

  3. 二进制日志

  4. 事务日志:可能存在执行一半的事务,如果需要撤销或者提交,就必须有事务日志

mysql提供mysqldump(逻辑备份)对mysql进行热备,性能不是很好。但是最好的还是主从架构,在从服务器上进行冷备。

备份策略

完全+增量

完全+差异

多久作一次完全备份?多久作一次增量(差异)备份?还原时长等,这也是备份策略需要考虑的。如果数据变化不是特别大,可以一周(一天)一次完全,一天(一小时)一次增量(差异)。

备份工具

mysql自带两个备份工具:

  1. mysqldump:逻辑备份工具,对MyISAM是温备,对InnoDB是热备

  2. mysqlhotcopy:物理备份工具,是一个温备工具(事实上是一个冷备),会进行锁表操作

可以使用文件系统备份工具:

  1. cp:只能是冷备

  2. 逻辑卷的快照功能,几乎属于热备

快照备份流程:先flush table,lock table,然后创建快照,再unlock tables,最后复制数据。但是,对于InnoDB(支持事务),fulsh table,lock table,仍有可能再写入数据,所以做快照时,要对缓存进行监控。

第三方工具:

  1. ibbackup:商业工具

  2. xtrabackup:开源工具

mysql备份工具对比:

mysqldump

mysqldump是逻辑备份,可以实现完全备份+增量(差异)备份

mysqldump常用选项:

db_name [tb_name]:数据库名字,用于备份指定数据库,甚至数据库中的指定表,但是备份时,该数据库存在(备份不包括创建数据库过程)。备份特定数据库,数据库中特定表

--master-data=n n可取0,1,2 0表示不记录二进制日志文件和事件位置,1表示记录以CHANGE MASTER TO 的方式记录位置,可用于恢复后直接启动从服务器,2表示以CHANGE MASTER TO 方式记录位置,但是默认为注释

--lock-all-tables mysqldump自动锁表,锁定所有表

--flush-logs 锁完表执行日志滚动

--single-transaction 如果是InnoDB存储引擎的库,则可以使用该选项,表示启动热备。热备份会启动一个很长的事务

--all-databases 备份所有库

--databases DB_name 备份指定库

[root@mysql ~]# mysqldump -uroot -p fsx > /root/fsx.sql
Enter password: 
[root@mysql ~]# ls
anaconda-ks.cfg  fsx.sql
[root@mysql ~]# cat fsx.sql 
-- MySQL dump 10.14  Distrib 5.5.35-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: fsx
-- ------------------------------------------------------
-- Server version   5.5.35-MariaDB-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `fsx`
--

DROP TABLE IF EXISTS `fsx`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `fsx` (
  `sid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(3) unsigned NOT NULL,
  `sex` enum('女','男') DEFAULT NULL,
  `cid1` tinyint(3) unsigned DEFAULT NULL,
  `cid2` tinyint(3) unsigned DEFAULT NULL,
  `tid` tinyint(3) unsigned DEFAULT NULL,
  `time_start` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=gbk;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `fsx`
--

LOCK TABLES `fsx` WRITE;
/*!40000 ALTER TABLE `fsx` DISABLE KEYS */;
INSERT INTO `fsx` VALUES (1,'njx',20,'女',8,5,5,'2018-06-02 02:55:05'),(2,'hmk',27,'男',2,3,5,'2018-06-02 02:55:06'),(3,'roy',24,'男',10,2,5,'2018-06-02 02:55:06'),(4,'ldy',17,'男',7,7,1,'2018-06-02 02:55:06'),(5,'rlj',22,'男',3,1,3,'2018-06-02 02:55:06'),(6,'zbx',25,'女',5,3,4,'2018-06-02 02:55:06'),(7,'wsq',28,'男',1,6,3,'2018-06-02 02:55:06'),(8,'wdb',18,'女',4,7,1,'2018-06-02 02:55:06'),(9,'ljd',19,'女',1,7,1,'2018-06-02 02:55:06'),(10,'fkt',25,'男',5,10,4,'2018-06-02 02:55:06'),(11,'aqp',26,'女',2,2,1,'2018-06-02 02:55:06'),(12,'tbk',27,'男',2,3,1,'2018-06-02 02:55:06'),(13,'eld',21,'女',6,10,3,'2018-06-02 02:55:06'),(14,'sld',16,'男',5,8,2,'2018-06-02 02:55:06'),(15,'vez',27,'女',3,8,2,'2018-06-02 02:55:06'),(16,'ypu',17,'女',1,6,4,'2018-06-02 02:55:06');
/*!40000 ALTER TABLE `fsx` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-06-02 10:55:55

还原过程:

MariaDB [(none)]> DROP DATABASE fsx;    //模拟丢失fsx库
Query OK, 1 row affected (0.09 sec)

//如果直接导入,则会提示没有数据库被选中
[root@mysql ~]# mysql fsx < fsx.sql 
Warning: mysql: ignoring option '--named-commands' due to invalid value 'root'
ERROR 1049 (42000): Unknown database 'fsx'


//所以先创建数据库
MariaDB [(none)]> CREATE DATABASE fsx;
Query OK, 1 row affected (0.01 sec)


//然后还原
[root@mysql ~]# mysql fsx < fsx.sql 

MariaDB [fsx]> SHOW TABLES;
+---------------+
| Tables_in_fsx |
+---------------+
| fsx           |
+---------------+
1 row in set (0.00 sec)

如上操作,如果再还原时,有用户正在写入数据到fsx数据库,则会导致时间点的不一致,所以应该锁表

MariaDB [(none)]> DROP DATABASE fsx;    //模拟丢失fsx库
Query OK, 1 row affected (0.09 sec)
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [fsx]> INSERT INTO fsx (name,age,sex,cid1,cid2,tid)  VALUES('ttt',33,'男',4,3,2);    //施加读锁,不能执行写操作
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock

在终端执行:
[root@mysql ~]# mysqldump -uroot -p fsx > fsx.sql 
Enter password: 

在服务器上释放锁,并查看数据还原结果:
MariaDB [fsx]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [fsx]> SELECT * FROM fsx;
+-----+------+-----+------+------+------+------+---------------------+
| sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
+-----+------+-----+------+------+------+------+---------------------+
|   1 | njx  |  20 | 女   |    8 |    5 |    5 | 2018-06-02 10:55:05 |
|   2 | hmk  |  27 | 男   |    2 |    3 |    5 | 2018-06-02 10:55:06 |
|   3 | roy  |  24 | 男   |   10 |    2 |    5 | 2018-06-02 10:55:06 |
|   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
|   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
|   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
|   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
|   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
|   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
|  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
|  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
|  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
|  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
|  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
|  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
|  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
+-----+------+-----+------+------+------+------+---------------------+
16 rows in set (0.00 sec)

当我们还原数据时,尽管加了锁,有可能仍在写入数据,所以要还原时还要还原从备份开始到还原时的二进制日志,所以在备份前进行二进制日志滚动(FLUSH LOGS)记录一个点,最后还原时,也还原从该点开始的二进制日志记录的信息。mysql提供了--master-data=n解决该问题。

[root@mysql ~]# mysqldump -uroot -pfsx123.456  --master-data=2 fsx > fsx`date +%F+%H+%M+%S`.sql
[root@mysql ~]# ls fsx2018-06-02+11+11+30.sql 
fsx2018-06-02+11+11+30.sql

在备份好的文件中,有一行信息,可以查看到备份后二进制日志文件,包括起始位置
-- CHANGE MASTER TO MASTER_LOG_FILE='1.000008', MASTER_LOG_POS=245;

备份多个库

--all-databases:备份所有库

--databases DB_name:备份指定库

这两个命令会自动创建库,在还原前不用手动指定库

备份所有库:


[root@mysql ~]# mysqldump -uroot -pfsx123.456 --lock-all-tables --flush-logs --all-databases --master-data=2 > all.sql
[root@mysql ~]# du -sh all.sql 
508K    all.sql

模拟备份

备份策略:每周完全+每日增量

完全备份:mysqldump //实际生产环境,数据量不是很大,可以使用mysqldump

增量备份:备份二进制日志(每日flush logs方便使用二进制日志)

模拟当前时间点所有库损坏,进行还原。

损坏前:

  1. 使用mysqldump备份

    [root@mysql ~]# mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > alldatabases.sql
    Enter password: 
    //备份完成后可以看到二进制日志滚动到1.000011,也就是二进制日志11之前的都已经备份,可以删除。但是不建议删除,有时候会有救急作用
    -- CHANGE MASTER TO MASTER_LOG_FILE='1.000011', MASTER_LOG_POS=245;
    
    MariaDB [(none)]> PURGE BINARY LOGS TO '1.000011';
    Query OK, 0 rows affected (0.11 sec)
    
    MariaDB [(none)]> SHOW BINARY LOGS;
    +----------+-----------+
    | Log_name | File_size |
    +----------+-----------+
    | 1.000011 |       245 |
    +----------+-----------+
    1 row in set (0.00 sec)
    
  2. 备份结束后,模拟增量备份

  • 第一天对mysql库某些数据进行了修改:

  1. 删除fsx库中fsx表内某些行

    
    MariaDB [fsx]> SELECT * FROM fsx;
    +-----+------+-----+------+------+------+------+---------------------+
    | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
    +-----+------+-----+------+------+------+------+---------------------+
    |   1 | njx  |  20 | 女   |    8 |    5 |    5 | 2018-06-02 10:55:05 |
    |   2 | hmk  |  27 | 男   |    2 |    3 |    5 | 2018-06-02 10:55:06 |
    |   3 | roy  |  24 | 男   |   10 |    2 |    5 | 2018-06-02 10:55:06 |
    |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
    |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
    |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
    |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
    |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
    |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
    |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
    |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
    |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
    |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
    |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
    |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
    |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
    |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
    +-----+------+-----+------+------+------+------+---------------------+
    17 rows in set (0.00 sec)
    
    MariaDB [fsx]> DELETE FROM fsx WHERE tid>4;
    
    Query OK, 3 rows affected (0.07 sec)
    MariaDB [fsx]> SELECT * FROM fsx;
    +-----+------+-----+------+------+------+------+---------------------+
    | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
    +-----+------+-----+------+------+------+------+---------------------+
    |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
    |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
    |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
    |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
    |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
    |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
    |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
    |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
    |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
    |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
    |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
    |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
    |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
    |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
    +-----+------+-----+------+------+------+------+---------------------+
    

  2. 模拟第一天增量备份

    MariaDB [fsx]> FLUSH LOGS;
    Query OK, 0 rows affected (0.16 sec)
    [root@mysql mysql]# pwd
    /var/lib/mysql
    [root@mysql mysql]# ls 1.*
    1.000011  1.000012  1.index
    [root@mysql mysql]# mysqlbinlog 1.000011 > /root/day01.sql
    //对11的二进制日志进行物理备份
  • 第一天对mysql库某些数据进行了修改:

  1. 给fsx库中fsx表内插入数据

    MariaDB [fsx]> INSERT INTO fsx (name,age,sex,cid1,cid2,tid) VALUES('fsx',24,'男',1,3,5);
    Query OK, 1 row affected (0.10 sec)
    
    MariaDB [fsx]> INSERT INTO fsx (name,age,sex,cid1,cid2,tid) VALUES('tony',14,'男',5,2,5);
    Query OK, 1 row affected (0.09 sec)
    MariaDB [fsx]> SELECT * FROM fsx;
    +-----+------+-----+------+------+------+------+---------------------+
    | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
    +-----+------+-----+------+------+------+------+---------------------+
    |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
    |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
    |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
    |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
    |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
    |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
    |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
    |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
    |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
    |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
    |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
    |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
    |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
    |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
    |  18 | fsx  |  24 | 男   |    1 |    3 |    5 | 2018-06-02 11:51:42 |
    |  19 | tony |  14 | 男   |    5 |    2 |    5 | 2018-06-02 11:51:54 |
    +-----+------+-----+------+------+------+------+---------------------+
    16 rows in set (0.00 sec)
    

  2. 第二天二进制日志增量备份

    
    [root@mysql mysql]# cp 1.000012 /root/day02.sql
    

模拟数据库损坏:

  • 模拟删除了数据库

  1. 模拟删除mysql的数据目录下所有数据信息(二进制日志不能删,工业环境下,二进制日志和数据不用该在同一块磁盘上)

    
    [root@mysql mysql]# rm -rf *
    [root@mysql mysql]# pwd
    /var/lib/mysql
    [root@mysql mysql]# ls
  2. 此时的mysql崩溃了,只能使用kill命令杀死mysql守护进程

    
     [root@mysql ~]# killall mysql
     [root@mysql ~]# ps -ax |grep mysql
     5428 pts/5    S+     0:00 grep --color=auto mysql
    

开始备份:

使用mysql命令方式导入

  1. 初始化mysql库

    [root@mysql local]# yum reinstall mariadb
    如果是源吗编译,则执行mysql路径下,scripts/mysql_install_db --user=mysql --data_dir=/path/to/mysqldata
    [root@mysql ~]# systemctl start mariadb
    

    如果在家目录下有.my.cnf,删除之

  2. 导入备份数据

    • 先还原完全备份:

      [root@mysql ~]# mysql < alldatabases.sql
      MariaDB [(none)]> SHOW DATABASES;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | fsx                |
      | fsx_test           |
      | mysql              |
      | performance_schema |
      | test               |
      +--------------------+
      6 rows in set (0.00 sec)
      
      MariaDB [(none)]> USE fsx
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A
      
      Database changed
      MariaDB [fsx]> SHOW TABLES;
      +---------------+
      | Tables_in_fsx |
      +---------------+
      | fsx           |
      +---------------+
      1 row in set (0.00 sec)
      
      MariaDB [fsx]> SELECT * FROM fsx;
      +-----+------+-----+------+------+------+------+---------------------+
      | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
      +-----+------+-----+------+------+------+------+---------------------+
      |   1 | njx  |  20 | 女   |    8 |    5 |    5 | 2018-06-02 10:55:05 |
      |   2 | hmk  |  27 | 男   |    2 |    3 |    5 | 2018-06-02 10:55:06 |
      |   3 | roy  |  24 | 男   |   10 |    2 |    5 | 2018-06-02 10:55:06 |
      |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
      |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
      |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
      |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
      |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
      |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
      |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
      |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
      |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
      |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
      |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
      |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
      |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
      |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
      +-----+------+-----+------+------+------+------+---------------------+
      17 rows in set (0.00 sec)
      //注意,此时完全备份出来的结果tid>5的都在
    • 导入第一天增量备份

      [root@mysql ~]# mysql < day01.sql 
      MariaDB [fsx]> SELECT * FROM fsx;
      +-----+------+-----+------+------+------+------+---------------------+
      | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
      +-----+------+-----+------+------+------+------+---------------------+
      |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
      |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
      |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
      |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
      |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
      |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
      |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
      |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
      |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
      |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
      |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
      |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
      |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
      |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
      +-----+------+-----+------+------+------+------+---------------------+
      14 rows in set (0.00 sec)
      //此时,tid>5的没了,因为day01执行过删除tid>5行的操作
    • 导入第二天增量备份

      [root@mysql ~]# mysqlbinlog day02.sql > temp.sql
      [root@mysql ~]# mysql < temp.sql 
      //由于第二天的二进制日志是copy的,所以要先执行mysqlbinlog命令,导入成sql文件
      
      MariaDB [fsx]> SELECT * FROM fsx;
      +-----+------+-----+------+------+------+------+---------------------+
      | sid | name | age | sex  | cid1 | cid2 | tid  | time_start          |
      +-----+------+-----+------+------+------+------+---------------------+
      |   4 | ldy  |  17 | 男   |    7 |    7 |    1 | 2018-06-02 10:55:06 |
      |   5 | rlj  |  22 | 男   |    3 |    1 |    3 | 2018-06-02 10:55:06 |
      |   6 | zbx  |  25 | 女   |    5 |    3 |    4 | 2018-06-02 10:55:06 |
      |   7 | wsq  |  28 | 男   |    1 |    6 |    3 | 2018-06-02 10:55:06 |
      |   8 | wdb  |  18 | 女   |    4 |    7 |    1 | 2018-06-02 10:55:06 |
      |   9 | ljd  |  19 | 女   |    1 |    7 |    1 | 2018-06-02 10:55:06 |
      |  10 | fkt  |  25 | 男   |    5 |   10 |    4 | 2018-06-02 10:55:06 |
      |  11 | aqp  |  26 | 女   |    2 |    2 |    1 | 2018-06-02 10:55:06 |
      |  12 | tbk  |  27 | 男   |    2 |    3 |    1 | 2018-06-02 10:55:06 |
      |  13 | eld  |  21 | 女   |    6 |   10 |    3 | 2018-06-02 10:55:06 |
      |  14 | sld  |  16 | 男   |    5 |    8 |    2 | 2018-06-02 10:55:06 |
      |  15 | vez  |  27 | 女   |    3 |    8 |    2 | 2018-06-02 10:55:06 |
      |  16 | ypu  |  17 | 女   |    1 |    6 |    4 | 2018-06-02 10:55:06 |
      |  17 | ttt  |  33 | 男   |    4 |    3 |    2 | 2018-06-02 11:02:58 |
      |  18 | fsx  |  24 | 男   |    1 |    3 |    5 | 2018-06-02 11:51:42 |
      |  19 | tony |  14 | 男   |    5 |    2 |    5 | 2018-06-02 11:51:54 |
      +-----+------+-----+------+------+------+------+---------------------+
      16 rows in set (0.00 sec)
      //day02的操作生成的数据也回来了

mysql备份脚本

要求:将脚本加入任务计划,在每周二凌晨两点半自动执行完全备份(此时mysql最空闲),每天凌晨三点半执行二进制脚本。将执行的备份文件保存到/mnt/mysql_back目录中

  1. 编写完全备份脚本

    [root@mysql mnt]# cat mysqldump_all.sh 
    #/bin/bash
    #定义变量,为当前备份时间
    name=`date +%F+%H+%M+%S`
    
    #创建目录,用来保存备份文件,-p表示不存在该目录,再创建
    mkdir -p /mnt/mysql_back/   
    
    `mysqldump -uroot -pfsx123.456 --master-data=2 --flush-logs --all-databases --lock-all-tables > /mnt/mysql_back/$name.sql`
  2. 编写二进制日志备份脚本

    [root@mysql mnt]# cat mysqldump_binary.sh 
    #!/bin/bash
    
    #为了获取恢复节点
    da=`mysql -uroot -pfsx123.456 -e 'SHOW MASTER STATUS'`  
    bnary_name=`expr substr "$da" 45 8`
    
    name=`date +%F+%H+%M+%S`
    mkdir -p /mnt/mysql_back/binary 
    
    #每次生成二进制日志前,执行一次二进制日志滚动
    `mysql -uroot -pfsx123.456 -e 'FLUSH LOGS'` 
    
    `mysqlbinlog /var/lib/mysql/$bnary_name > /mnt/mysql_back/binary/$name.sql`
    
  3. 创建计划任务

    
    [root@mysql mnt]# crontab -e
    30 02 * * 2 bash /mnt/mysqldump_all.sh
    30 03 * * * bash /mnt/mysqldump_binary.sh
    //第一行表示每周二,凌晨两点半执行mysqldump_all.sh脚本
    //第二行表示每天,凌晨三点半指定mysqldump_binary.sh脚本

  4. 创建还原脚本,在服务器出问题时使用

    [root@mysql mnt]# pwd
    /mnt
    [root@mysql mnt]# cat mysql_recovery.sh 
    #!/bin/bash
    #将自动登陆mysql的配置文件移除
    mv /root/.my.cnf /root/.my.cnf.bak
    #杀死mysqld进程,mysql服务器损坏,可能进程还存在
    `killall mysqld`
    #重新初始化mysql
    
    `yum reinstall -y mariadb`
    
    #启动mysql
    `systemctl start mariadb`
    
    `mysql < $1`
    `systemctl restart mariadb`
    
    for i in `ls /mnt/mysql_back/binary/`
    do
        `mysql -uroot -pfsx123.456 < /mnt/mysql_back/binary/$i`
    done
    #将自动登陆mysql的配置文件移动回来
    mv /root/.my.cnf.bak /root/.my.cnf
    

    执行脚本:

    
    找到最后一次完全备份的sql文件:如我的为/mnt/mysql_back/2018-06-02+12+50+33.sql
    则切换到/mnt/mysql_back/目录下,执行
    [root@mysql mysql_back]# bash /mnt/mysql_recovery.sh 2018-06-02+12+50+33.sql 

    搞定!!!


猜你喜欢

转载自blog.csdn.net/fsx2550553488/article/details/80547341