1,前言
数据备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程。传统的数据备份主要是采用内置或外置的磁带机进行冷备份。但是这种方式只能防止操作失误等人为故障,而且其恢复时间也很长。随着技术的不断发展,数据的海量增加,不少的企业开始采用网络备份。网络备份一般通过专业的数据存储管理软件结合相应的硬件和存储设备来实现。
2,数据备份分类
1)物理备份
物理备份简称冷备:就是直接拷贝,打包如:cp,tar
特点:
备份时数据库的版本要一致
操作系统要一样,不可跨平台
不适合innodb存储引擎的数据库备份
备份时间长,冗余备份,浪费存储空间
....
2)逻辑备份
逻辑备份就是对数据库对象(如用户、表、存储过程等)利用EXPORT,mysqldump等工具进行导出工作,可以利用IMPORT,mysql等工具把逻辑备份文件导入到数据库.
3,数据备份策略
完全备份:
备份所有数据.
增量备份:
备份上次备份后,备份所有新产生的数据.
差异备份:
备份完全备份后,备份所有新产生的数据.
4,部曲一-->mysqldump备份与恢复
用mysqldump备份,mysql来恢复数据
命令:
mysqldump -u 用户名 -p'密码' 库名 > /路径/xxx.sql #备份数据
mysql -u 用户名 -p'密码' 库名 < 路径/xxx.sql #恢复数据
备份数据库名表示方式:
--all-databases | -A 所有数据库
数据库名 单个数据库
数据库名 表名 单张表
-B 数据库1 数据库2 .... 多个数据
单个数据库
[root@mysql-50 ~]# mysqldump -uroot -p123456 db2 >/data/db2.sql
mysql>drop database db2;
mysql>create database db2;
[root@mysql-50 ~]# mysql -uroot -p123456 db2 < /data/db2.sql
提示:恢复单个整个数据库要先新建数据库,需要先建数据库
多个数据库
[root@mysql-50 ~]# mysqldump -uroot -p123456 -B db3 db4 >/data/db3-db4.sql
mysql>drop database db3;
mysql>drop database db4;
[root@mysql-50 ~]# mysql -uroot -p123456 < /data/db3-db4.sql
恢复全部数据库
[root@mysql-50 ~]# mysqldump -uroot -p123456 -A > /data/alldb.sql
[root@mysql-50 ~]# mysql -uroot -p123456 < /data/alldb.sql
缺点:
锁表
不能实现实时备份
效率较低,备份和还原速度慢
备份过程中,数据插入和更新操作会被挂起(锁表)
4,部曲二-->mysqlbinlog工具
--binlog日志
采用binlog日志的好处:
记录除查询之外的所有sql命令
可用于数据恢复
配置mysql主从同步的必要条件
可以达到实时增量备份
1)启用日志文件
[root@mysql-50 ~]# mkdir /mysqllog
[root@mysql-50 ~]# chown -R mysql:mysql /mysqllog
[root@mysql-50 ~]# vim /etc/my.cnf
[mysqld]
#log_bin #开启日志,使用默认,默认位置mysql的初始化目录,名称为主机名称
#log_bin=jluo #开启日志,并指定日志名称
log_bin=/mysqllog/mysql #开启日志,并指定日志位置和名称
server_id=50 #mysql5.7必须写,且id号不能重复
#Max_binlog_size=数字m #修改日志大小,(默认1G),满后自动新建另一个
binlog_format="mixed"
#statement:每一条修改数据的sql命令都记录在binlog日志中
#row:不记录sql语句上下文相关信息,仅保存哪条记录被修改
#mixed:是以上两种格式的混合使用
[root@mysql-50 ~]# systemctl restart mysqld
[root@mysql-50 ~]# ls /mysqllog/
mysql.000001 mysql.index #第一个文件是日志文件,第二个是日志索引文件
2)手动生成新的日志文件
重启mysql服务
执行sql操作 mysql>flush logs;
Mysqldump --flush-logs
Mysql -uroot -p密码 -e ‘flush logs’ #-e 后面不能跟太复杂的命令
例子:
mysqldump --flush-logs -uroot -p123456 db4 > /data/db4.sql
3)清理Binlog日志
mysql> show master status; #查看当前使用的日志文件
删除早于指定版本的binlog日志
Purge master logs to “binlog文件名”;
删除所有binlog日志,重建新日志
Reset master;
提示:
不介意使用系统命令删除,使用mysql命令删除
例子:
mysql> purge master logs to "mysql.000004"; #删除指定文件之前的,不包括此文件
mysql> reset master; #重建新日志
4)mysqlbinlog工具
格式:
Mysqlbinlog [选项] binlog日志文件名
常用选项
--start-datetime=”yyyy-mm-dd hh:mm:ss” #开始于时间点
--stop-datetime=”yyyy-mm-dd hh:mm:ss” #结束于时间点
--start-position=数字 #开始位置(偏移量)
--stop-position=数字 #结束偏移量
例子:
mysql> create table t1 (id int);
mysql> insert into t2 values (1);
mysql> insert into t2 values (2);
mysql> insert into t2 values (3);
[root@mysql-50 mysqllog]# mysqlbinlog mysql.000001 | grep create
#181121 11:31:34 server id 50 end_log_pos 123 CRC32 0x9834a147 Start: binlog v 4, server v 5.7.17-log created 181121 11:31:34 at startup
create table t1 (id int)
[root@mysql-50 mysqllog]# mysqlbinlog mysql.000001 | grep insert
insert into t1 values(1)
insert into t1 values(2)
insert in