mysqldump备份介绍mysql
mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头从新建立数据库所必需的命令CREATE TABLE INSERT等,适用于备份数据量不大的数据库。sql
优势:备份简单,恢复容易。shell
备份缺点:schema和数据存储在一块儿,巨大的SQL语句、单个巨大的备份文件(备份的库和表都在一个文件中)。数据库
mysqldump: 是一个mysql客户端命令,经过mysql协议链接至mysqld,实现数据库备份vim
mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表bash
mysqldump[OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:备份一个或多个库网络
mysqldump[OPTIONS] --all-databases [OPTIONS]:备份全部库ide
-A,--all-databases #备份全部数据库函数
InnoDB:spa
--single-transaction:启动一个大的单一事务实现备份
-B,--databases db_name1 db_name2 ...:备份指定的数据库
-C,--compress:压缩传输;
-x, --lock-all-tables:锁定全部表
-l, --lock-tables:锁定备份的表
--flush-logs,-F:锁定表以后执行flush logs命令;
其它选项:
-E,--events:备份指定库的事件调度器;
-R,--routines:备份存储过程和存储函数;
--triggers:备份触发器
--master-data[=#]:
1:记录CHANGE MASTER TO语句;此语句未被注释;
2:记录为注释语句;
特别说明:Mariadb的数据恢复严重依赖与bin-log日志,因此为了防止磁盘故障致使数据文件和bin-log文件一块儿丢失,因此最好将bin-log日志存放到共享存储中。
设置方法:修改Mariadb配置文件,将日志文件存放位置指向本地挂载网络存储的路径,而后重启Mariadb服务便可。
[root@MariaDB ~]# vim /etc/my.cnf log-bin="/backup/bin-log/mysql-bin.x"
验证:重启服务以后/backup/bin-log/目录下就有了Mysql的二进制日志文件和日志索引文件。
[root@MariaDB ~]# ll /backup/bin-log/mysql-bin.* -rw-rw---- 1 mysql mysql 245 Jun 16 00:00/backup/bin-log/mysql-bin.000001 -rw-rw---- 1 mysql mysql 33 Jun 16 00:00/backup/bin-log/mysql-bin.index
数据库中有hellodb表一个,须要作对hellodb表的备份,以实现数据库故障或者发生误删除操做时能够及时恢复数据库。
备份方案为:每周日彻底备份一次数据库,周一到周六增量备份数据库
第一天备份:彻底备份hellodb数据库,而且在彻底备份的时候锁定表和滚动二进制日志
[root@MariaDB~]# mysqldump -B hellodb -u root -p --lock-all-tables --flush-logs --master-data=2 > /backup/hellodb-`date+%F`.sql Enterpassword: [root@MariaDB~]# ll /backup/ total8 -rw-r--r--1 root root 7950 Jun 16 11:59 hellodb-2015-06-16.sql
因为在作彻底备份的时候滚动了二进制日志,因此在作一些关于数据库更改的操做都会记录到新的二进制日志中,从查看中得知后续日志会记录到mysql-bin.000002中。
MariaDB [(none)]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 288 | | mysql-bin.000002 | 245 | +------------------+-----------+ 2 rows in set (0.00 sec)
备份完成以后的一天时间里,建立了一张表,而且向表中插入了一些数据
MariaDB[(none)]> use hellodb; MariaDB[hellodb]> create table tb1 (id int); MariaDB[hellodb]> insert into tb1 values (1),(2),(3); MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | +------+
第一天增量备份:当天的全部对数据库进行更改的语句都会记录到二进制日志文件中,只须要滚动二进制日志,把二进制日志进行备份便可,二进制滚动以后,次日的全部对数据库进行更改的语句,都会记录到新的二进制日志文件中。
MariaDB[hellodb]> flush logs; MariaDB [hellodb]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 288 | | mysql-bin.000002 | 577 | | mysql-bin.000003 | 245 | +------------------+-----------+ 3 rows in set (0.00 sec)
将二进制日志文件转换为sql文件
[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000002 > /backup/1.sql
次日操做:继续向tb1中插入数据
MariaDB[hellodb]> insert into tb1 values (21),(22),(23); MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 21 | | 22 | | 23 | +------+
故障模拟
hellodb数据库遭到误删除:
MariaDB[hellodb]> DROP database hellodb;
查看二进制日志是记录到了第三个日志
MariaDB[(none)]> show master logs; +------------------+-----------+ |Log_name | File_size | +------------------+-----------+ |mysql-bin.000001 | 288 | |mysql-bin.000002 | 577 | |mysql-bin.000003 | 533 | #当前日志的记录位置 +------------------+-----------+ 3rows in set (0.00 sec) MariaDB[(none)]> show binlog events in 'mysql-bin.000003'\G; ***************************5. row *************************** Log_name: mysql-bin.000005 Pos: 446 Event_type: Query Server_id: 1 End_log_pos:533 Info: DROP database hellodb #记录的删除语句 5rows in set (0.00 sec) ERROR:No query specified
因为是整个hellodb数据库遭到误删除,因此须要用一开始的彻底备份文件,以及第一天的增量备份文件,恢复hellodb数据库和第一天对数据库进行修改的内容。
次日对数据库进行修改的内容恢复:若是直接把当天的二进制日志导入到数据库,因为数据库中包含了删除语句,因此数据库仍是会被删除;因此在导入次日二进制日志时,须要删除日志中的DROP语句。
将次日的二进制日志文件转换成sql文件,放到backup目录下
[root@MariaDB~]# mysqlbinlog /backup/bin-log/mysql-bin.000003 > /backup/2.sql
打开2.sql文件能够看到DROP语句,删除这个语句
# at446 #15061612:15:22 server id 1 end_log_pos 533 Query thread_id=20 exec_time=0 error_code=0 SETTIMESTAMP=1434428122/*!*/; DROP database hellodb #删除或者注释这一行
恢复以前为了不产生没有用的二进制日志,能够关闭二进制日志的记录
MariaDB[(none)]> SET SESSION sql_log_bin=0;
将第一次的彻底备份数据导入到数据库
MariaDB [hellodb]> SOURCE /backup/hellodb-2015-06-16.sql;
查看数据库已经导入,可是tb1表不存在
MariaDB[(none)]> use hellodb; Databasechanged MariaDB[hellodb]> show tables; +-------------------+ |Tables_in_hellodb | +-------------------+ |classes | |coc | |courses | |scores | |students | |teachers | |toc | +-------------------+
导入第一天增量备份的1.sql文件。
MariaDB [hellodb]> SOURCE /backup/1.sql;
查看tb1表,发现第一天插入的数据都存在
MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | +------+
导入当天的2.sql文件
MariaDB [hellodb]> SOURCE /backup/2.sql;
查看数据已经彻底恢复
MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 21 | | 22 | | 23 | +------+
恢复完成,启用记录二进制日志
MariaDB[hellodb]> SET SESSION sql_log_bin=1;
特别说明:若是在恢复中关闭二进制日志,导入数据必须在Mariadb命令行导入,若是在shell命令行导入仍是会记录二进制日志的。
第一次彻底备份,备份时锁定表,并滚动二进制日志
[root@MariaDB ~]# mysqldump -A -u root -p--lock-all-tables --flush-logs --master-data=2 > /backup/ALL-`date +%F`.sql Enter password: [root@MariaDB ~]# ll /backup/ total 532 -rw-r--r-- 1 root root 1980 Jun 16 00:46 1.sql -rw-r--r-- 1 root root 1957 Jun 16 00:52 2.sql -rw-r--r-- 1 root root 521774 Jun 16 01:04ALL-2015-06-16.sql drwxr-xr-x 2 mysql mysql 4096 Jun 16 01:04 bin-log -rw-r--r-- 1 root root 7950 Jun 16 00:43hellodb-2015-06-16.sql
因为备份的时候滚动了二进制日志,因此备份以后全部对数据库产生更改的操做都会记录到mysql-bin.000004中。
MariaDB [hellodb]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 288 | | mysql-bin.000002 | 577 | | mysql-bin.000003 | 8833 | | mysql-bin.000004 | 245 | +------------------+-----------+ 4 rows in set (0.00 sec)
备份完成的当天作了一些操做。
MariaDB[hellodb]> delete from tb1 where id=21; MariaDB[hellodb]> delete from tb1 where id=22; MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | +------+
第一天增量备份
当天的全部对数据库进行更改的语句都会记录到二进制日志文件中,只须要滚动二进制日志,把二进制日志进行备份便可,二进制滚动以后,次日的全部对数据库进行更改的语句,都会记录到新的二进制日志文件中。
MariaDB [hellodb]> flush logs; MariaDB [hellodb]> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 288 | | mysql-bin.000002 | 577 | | mysql-bin.000003 | 8833 | | mysql-bin.000004 | 670 | | mysql-bin.000005 | 245 | +------------------+-----------+ 5 rows in set (0.00 sec)
将第一天的二进制日志文件转换为sql文件
[root@MariaDB ~]# mysqlbinlog /backup/bin-log/mysql-bin.000004> /backup/all.1.sql
次日对数据进行了一些操做
MariaDB[hellodb]> insert into tb1 values (1000),(9000); MariaDB[hellodb]> select * from tb1; +------+ |id | +------+ | 1 | | 2 | | 3 | | 23 | |1000 | |9000 | +------+
删除数据目录下的全部文件,模拟数据库故障:
[root@MariaDB ~]# rm -rf /mydata/data/*
数据库这个时候还能够登陆,可是数据库都再也不了
MariaDB [hellodb]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | +--------------------+
发现数据库故障先关闭数据库,可是数据库没法正常关闭,只能关闭进程
[root@MariaDB ~]# service mysqld stop MySQL server PID file could not be found! [FAILED] [root@MariaDB ~]# killall mysqld
因为数据库数据目录的全部内容被删除,就算是导入了彻底备份文件也是缺乏一些文件,解决方法就是从新初始化一下数据库。
[root@MariaDB ~]# cd /usr/local/mysql/ [root@MariaDB mysql]# scripts/mysql_install_db--user=mysql --datadir=/mydata/data/
初始化完成以后,一些基本的文件都存在了
[root@MariaDB mysql]# ll /mydata/data/ total 36 -rw-rw---- 1 mysql mysql 16384 Jun 16 01:22aria_log.00000001 -rw-rw---- 1 mysql mysql 52 Jun 16 01:22 aria_log_control -rw-r----- 1 mysql root 80 Jun 16 01:18 MariaDB.err drwx------ 2 mysql root 4096 Jun 16 01:22 mysql drwx------ 2 mysql mysql 4096 Jun 16 01:22 performance_schema drwx------ 2 mysql root 4096 Jun 16 01:22 test
将次日的二进制日志文件转换为sql文件
[root@MariaDB ~]# mysqlbinlog/backup/bin-log/mysql-bin.000005 > /backup/all.2.sql
恢复以前启动Mysql服务,不然没法导入备份文件
[root@MariaDB ~]# service mysqld start
导入第一天的彻底备份文件,因为刚刚初始化完成数据,这个时候的数据库尚未密码
[root@MariaDB ~]# mysql </backup/ALL-2015-06-16.sql
登陆数据库查看,全部的数据库都已经恢复,可是第一天对数据库更改的内容仍是没有恢复
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) MariaDB [hellodb]> select * from tb1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 21 | | 22 | | 23 | +------+ 6 rows in set (0.00 sec)
导入第一天的增量备份文件
[root@MariaDB ~]# mysql -u root -p < /backup/all.1.sql
发现第一天删除的文件已经不存在,可是次日添加的内容仍是没有
MariaDB [hellodb]> select * from tb1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 23 | +------+ 4 rows in set (0.00 sec)
导入次日的二进制日志转换后的sql文件。
[root@MariaDB ~]# mysql -u root -p </backup/all.2.sql
导入完成以后,数据库就回到了故障以前的状态
MariaDB [hellodb]> select * from tb1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 23 | | 1000 | | 9000 | +------+ 6 rows in set (0.00 sec)