mysql的备份和恢复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的备份和恢复相关的知识,希望对你有一定的参考价值。

mysql的备份和恢复


备份类型:


完全备份指的是备份整个数据集( 即整个数据库 )

部分备份指的是备份部分数据集(例如: 只备份一个表)

增量备份指的是备份自上一次备份以来(增量或完全)以来变化的数据; 特点: 节约空间、还原麻烦 

差异备份指的是备份自上一次完全备份以来变化的数据 特点: 浪费空间、还原比增量备份简单


备份策略:


本文介绍第一种备份方法,使用系统自带的工具mysqldump,mysqldump只支持全量备份

        mysqldump:

            全量+binlog


MyISAM存储引擎:支持温备,备份时要锁定表;

-x, --lock-all-tables:锁定所有库的所有表,读锁;

-l, --lock-tables:锁定指定库所有表;

InnoDB存储引擎:支持温备和热备;

--single-transaction:创建一个事务,基于此快照执行备份;

其它选项:

-R, --routines:备份指定库的存储过程和存储函数;

--triggers:备份指定库的触发器;

-E, --events:

 

--master-data[=#]

1:记录为CHANGE MASTER TO语句,此语句不被注释;

2:记录为CHANGE MASTER TO语句,此语句被注释;

--flush-logs:锁定表完成后,即进行日志刷新操作;


1、首先我们创建一个数据库和属于这个数据库的某个表



MariaDB [(none)]> create database hidb;
MariaDB [(none)]> use hidb;
MariaDB [hidb]> create table students(id int unsigned auto_increment primary key,name char(30) not null,age tinyint unsigned,gender ENUM(‘F‘,‘M‘),major varchar(200));
MariaDB [hidb]> desc students;查看表结构

技术分享


2、然后向表中插入一些数据


创建一个数组,给hidb这个库中的students表中自动添加一些内容,要求姓名自动递增,年龄对80取模加上18,性别定义数组随机为F或M


[[email protected] ~]#GENDER=(‘F‘ ‘M‘)
[[email protected] ~]#echo ${GENDER[0]}
[[email protected] ~]#echo ${GENDER[1]}
[[email protected] ~]#for i in {1..1000}; do mysql -e "insert into hidb.students(id,name,age,gender) values(‘$i‘,‘stu$i‘,‘$[$RANDOM%80+18]‘,‘${GENDER[$RANDOM%2]}‘);";done
MariaDB [hidb]> select * from students;
.....
.....
.....
|  998 | stu998  |   38 | F      | NULL  |
|  999 | stu999  |   91 | F      | NULL  |
| 1000  | stu1000 |   80 | M      | NULL  |
+------+---------+------+--------+--------------+

3、最后启动二进制日志


创建一个目录存放数据和日志文件

[[email protected] ~]#mkdir -pv /mydata/{data,logs}
mkdir: created directory ‘/mydata’
mkdir: created directory ‘/mydata/data’ 存放数据
mkdir: created directory ‘/mydata/logs’
[[email protected] ~]#chown -R mysql.mysql /mydata/* 将/mydata/目录下的所属者和所属组改为mysql
[[email protected] ~]#vim /etc/my.cnf.d/server.cnf 编辑配置文件指定二进制日志存放的路径
[server]
log_bin = /mydata/logs/master-log  不用加后缀
[[email protected] ~]#systemctl restart mariadb 重启服务让日志文件生效
[[email protected] ~]mysql
MariaDB [hidb]> set @@session.sql_log_bin=on; 启动二进制日志记录
MariaDB [hidb]> grant all on *.* to [email protected]‘172.18.77.%‘ identified by ‘centos‘; 授权用户可以通过远程登录连接

4、上述所有的环境以经准备就绪了;接下来我们准备另外一台服务器以供备份数据


[[email protected] ~]#mysqldump -uroot -pcentos -h172.18.77.7 --single-transaction -R --triggers -E --databases hidb --master-data=2 --flush-logs  > /root/hidb-$(date +%F-%H-%M-%S).sql
[[email protected] ~]#mysql < hidb-2017-11-14-11-38-09.sql 备份恢复

到这里就备份完成了,但是如何在备份从这里已经备份的之后的数据呢 ,这就是增量备份了,利用二进制日志进行备份


5、我们来模拟一下,比如我们在原来的主的mysql服务器上分别删除一行数据个插入一行数据

MariaDB [hidb]>  delete from students where id=999;
MariaDB [hidb]> insert into students (name,age,gender) values (‘Huangshang‘,‘30‘,‘M‘);

在另外一台主机上的备份数据库中是看不到这些删除和插入的数据的

[[email protected] ~]#less hidb-2017-11-14-11-38-09.sql 查看这二个文件可以看到从哪里开始增填新的内容,以供参考备份使用

匹配到是master-log.000006这个日志,从245字节开始

技术分享

[[email protected] logs]#mysqlbinlog  -j 245 master-log.000006 > /tmp/binlog.sql
[[email protected] logs]#scp /tmp/binlog.sql 172.18.77.77:/root/
[[email protected] ~]#mysql < binlog.sql 备份恢复

6、最后登录查看

在主服务器上删除的999行数据和新插入的一行数据已经备份到最新的数据了

技术分享


技术分享

注意:由于上述两台主机的主机名都是bixia,所以有可能区分不了哪台是主的mysql,哪个是用于备份的mysql主机,为了方便自己分的清楚建议修改主机名不一样,以防混淆。

以上是关于mysql的备份和恢复的主要内容,如果未能解决你的问题,请参考以下文章

mysql备份和恢复

MYSQL触发器在PHP项目中用来做信息备份恢复和清空

MYSQL触发器在PHP项目中用来做信息备份恢复和清空

MySQL基于mysqldump及lvmsnapshot备份恢复

如何进行数据库备份和恢复 mysql

如何用mysql命令备份和恢复