赞
踩
备份容易,还原难。一般情况,都是没事备份,出事还原。
备份:给数据创建一个数据副本,在出现任何数据故障时,保证数据不丢失。
RAID1,RAID10,是在硬件上保证数据备份,但是在逻辑上,并不能进行数据备份,比如:执行了DORP命令,RAID备份的数据也会丢失。
备份类型:
根据服务器是否可在线:
热备份:服务器在线备份,读写操作可继续进行,事务处理的同时进行备份
温备份:服务器在线备份,可以执行读操作,不可以写
冷备份:服务器离线备份,读写操作均不可进行
根据不同层面的备份:
物理备份:直接备份数据文件,复制操作,速度快,不需要mysql进程处理。
逻辑备份:将数据导出至文本文件,必要时候可以进行还原,速度比较慢,需要mysql进程参与,逻辑备份可能丢失数据精度(浮点数),对文本文件的操作比较简单,可移植能力强。
根据备份集:(备份策略:完全+增量 或者 完全+差异)
完全备份:备份整个数据集(以库为单位)
增量备份:只对上次完全备份(包括增量备份)变化以后的数据
差异备份:仅仅备份上次完全备份以来,变化的数据
备份结束,一定要作还原!!!
备份的对象:
数据
配置文件:运行特性发生变化也可能导致数据无法还原
二进制日志
事务日志:可能存在执行一半的事务,如果需要撤销或者提交,就必须有事务日志
mysql提供mysqldump(逻辑备份)对mysql进行热备,性能不是很好。但是最好的还是主从架构,在从服务器上进行冷备。
完全+增量
完全+差异
多久作一次完全备份?多久作一次增量(差异)备份?还原时长等,这也是备份策略需要考虑的。如果数据变化不是特别大,可以一周(一天)一次完全,一天(一小时)一次增量(差异)。
mysql自带两个备份工具:
mysqldump:逻辑备份工具,对MyISAM是温备,对InnoDB是热备
mysqlhotcopy:物理备份工具,是一个温备工具(事实上是一个冷备),会进行锁表操作
可以使用文件系统备份工具:
cp:只能是冷备
逻辑卷的快照功能,几乎属于热备
快照备份流程:先flush table,lock table,然后创建快照,再unlock tables,最后复制数据。但是,对于InnoDB(支持事务),fulsh table,lock table,仍有可能再写入数据,所以做快照时,要对缓存进行监控。
第三方工具:
ibbackup:商业工具
xtrabackup:开源工具
mysql备份工具对比:
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方便使用二进制日志)
模拟当前时间点所有库损坏,进行还原。
损坏前:
使用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)
备份结束后,模拟增量备份
第一天对mysql库某些数据进行了修改:
删除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 | +-----+------+-----+------+------+------+------+---------------------+
模拟第一天增量备份
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库某些数据进行了修改:
给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)
第二天二进制日志增量备份
[root@mysql mysql]# cp 1.000012 /root/day02.sql
模拟数据库损坏:
模拟删除了数据库
模拟删除mysql的数据目录下所有数据信息(二进制日志不能删,工业环境下,二进制日志和数据不用该在同一块磁盘上)
[root@mysql mysql]# rm -rf * [root@mysql mysql]# pwd /var/lib/mysql [root@mysql mysql]# ls
此时的mysql崩溃了,只能使用kill命令杀死mysql守护进程
[root@mysql ~]# killall mysql [root@mysql ~]# ps -ax |grep mysql 5428 pts/5 S+ 0:00 grep --color=auto mysql
开始备份:
使用mysql命令方式导入
初始化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,删除之
导入备份数据
先还原完全备份:
[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最空闲),每天凌晨三点半执行二进制脚本。将执行的备份文件保存到/mnt/mysql_back目录中
编写完全备份脚本
[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`
编写二进制日志备份脚本
[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`
创建计划任务
[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脚本
创建还原脚本,在服务器出问题时使用
[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
搞定!!!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。