mysql数据备份三部曲--jluocc

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 &gt; /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 into t1 values(3)

5)binlog恢复数据
思路:
使用mysqlbinlog提取历史sql操作
通过管道交给mysql命令执行

例子:

[root@mysql-50 mysqllog]# mysqldump -uroot -p123456 db2 < /data/db2.sql   #备份
mysql> insert into t2 values(11,'陈红',12);
mysql> update t2 set name='貂蝉' where id = 2;
mysql> drop database db2;    #删库
mysql> create database db2;
[root@mysql-50 mysqllog]# mysql -u root -p123456 db2 < /data/db2.sql 
[root@mysql-50 mysqllog]# mysqlbinlog --start-position=296 --stop-position=1857 mysql.000001 | mysql -u root -p123456

5,部曲三
XtraBackup工具
一款强大的在线热备份工具
备份过程中不锁库表,适合生产环境,(备份到哪一行就锁哪一行)
由专业组织percona提供(改进mysql分支)
主要含有两个组件
Xtrabackup:c程序,支持innodb/xtradb
Innobackupex:以perl脚本封装xtrabackup,还支持myisam
提示:实际只有innodb存储引擎支持实时增量备份

1)安装软件包

[root@mysql-50 jluo]# yum -y install libev-4.15-1.el6.rf.x86_64.rpm
[root@mysql-50 jluo]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm 

2)完全备份与恢复
 
格式:
Innobackupex 选项  路径
基本选项:
--host:主机名,不写默认本机地址
--user:用户名
--port:端口号,不写默认3306
--password:用户密码
--databases:数据库名 #=”库名”:单个库 =”库1 库2”:多个库 =”库.表”:单个表 不写默认备份所有库
--no-timestamp:不用日期命令备份文件存储的子目录名
--redo-only:日志合并
--apply-log:准备还原(回滚日志)
--copy-back:恢复数据
--incremental 目录名:指定增量备份目录(目录必须为空)    
--incremental-basedir=目录名:增量备份时,指定上一次备份数据存储的目录名
--incremental-dir=目录名:准备恢复数据时,指定增量备份数据存储的目录名
--export:导出表信息
import:导出表空间

提示:
 1,恢复全部数据库时要求数据库目录必须为空,恢复单个或多个数据库(数据表时不需要为空)
 2,备份目录必须为空

例子:
1,备份
1)备份前查看数据库信息

mysql> show databases;    #备份前查看数据库信息
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db5                |
| mysql              |
| performance_schema |
| stum               |
| stusystem          |
| sys                |
+--------------------+
7 rows in set (0.01 sec)

2)完全备份
[root@mysql-50 ~]# innobackupex --user root --password 123456 --no-timestamp /bak/alldir

3)向表里写数据增量备份

mysql> insert into db5.t1 values(1212);
mysql> insert into db5.t1 values(1212);
[root@mysql-50 ~]# innobackupex --user root --password 123456 --incremental /bak/new1dir --incremental-basedir=/bak/alldir --no-timestamp

4)再向表里写数据增量备份

mysql> insert into db5.t1 values(1313);
mysql> insert into db5.t1 values(1313);
[root@mysql-50 ~]# innobackupex --user root --password 123456 --incremental /bak/new2dir --incremental-basedir=/bak/new1dir --no-timestamp

[root@mysql-50 ~]# ls /bak/alldir/
backup-my.cnf   mysql               sys                     xtrabackup_logfile
db5             performance_schema  xtrabackup_binlog_info
ib_buffer_pool  stum                xtrabackup_checkpoints
ibdata1         stusystem           xtrabackup_info

[root@mysql-50 ~]# vim /bak/alldir/xtrabackup_checkpoints  #备份信息文件
backup_type = full-backuped  #完全备份
from_lsn = 0                           #lsn:日志序列号
to_lsn = 7002759
last_lsn = 7002768
compact = 0
recover_binlog_info = 0

[root@mysql-50 ~]# vim /bak//new1dir/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 7002759
to_lsn = 7005238
last_lsn = 7005247
compact = 0
recover_binlog_info = 0

[root@mysql-50 ~]#  vim /bak/new2dir/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 7005238
to_lsn = 7005861
last_lsn = 7005870
compact = 0
recover_binlog_info = 0

2,恢复数据
步骤:
1,准备恢复数据
2,合并日志文件(同时也拷贝数据到主目录里)
3,把备份目录下数据拷贝到数据库目录下
4,修改数据库目录的所有者和组用户为mysql
5,启动数据库服务
例子:

[root@mysql-50 ~]# systemctl stop mysqld #停掉mysql
[root@mysql-50 ~]# rm -rf /var/lib/mysql #删掉数据库,模拟数据库损坏,要重新恢复数据
[root@mysql-50 ~]# mkdir /var/lib/mysql #新建数据库目录

[root@mysql-50 ~]# innobackupex --apply-log --redo-only /bak/alldir/
[root@mysql-50 ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new1dir/  /bak/alldir/
[root@mysql-50 ~]# innobackupex --apply-log --redo-only --incremental-dir=/bak/new2dir/  /bak/alldir/
[root@mysql-50 ~]# innobackupex --copy-back /bak/alldir/
[root@mysql-50 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql-50 ~]# systemctl restart mysqld
[root@mysql-50 ~]# mysql -uroot -p123456
mysql> show databases;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db5                |
| mysql              |
| performance_schema |
| stum               |
| stusystem          |
| sys                |
+--------------------+
7 rows in set (0.01 sec)

3,恢复完全备份中的单个表
步骤: 
1,备份单个数据库
2,删除数据库的单个表
3,新建一张表,并且与刚才删除表的结构一样,并删除该表的空间文件
3,导出表信息
4,拷贝表信息文件到mysql目录对应数据库下
5,修改所有者权限
6,导入表空间

[root@mysql-50 ~]# innobackupex --user root  --password 123456 --databases="db5"  /db5bak  --no-timestamp #备份数据库
mysql> drop table db5.t2;  #模拟删除库
mysql> create table t2( name char(10));#新建的t2必须与删除的t2表结构一样
[root@mysql-50 ~]# ls /var/lib/mysql/db5/ #查看新建对应数据库文件
db.opt  t1.frm  t1.ibd  t2.frm  t2.ibd
mysql> alter table db5.t2 discard tablespace; #删除表空间文件,即删除t2.idb文件
[root@mysql-50 ~]# ls /var/lib/mysql/db5/ #查看删除表空间后的数据库文件
db.opt  t1.frm  t1.ibd  t2.frm
[root@mysql-50 ~]# innobackupex --user root --password 123456 --apply-log  --databases=”db5” --export  /db5bak/  #导出表信息
[root@mysql-50 ~]# cp /db5bak/db5/t2.{ibd,cfg,exp} /var/lib/mysql/db5/   #拷贝文件
[root@mysql-50 ~]# chown -R mysql:mysql  /var/lib/mysql/db5/t2.* #授权
mysql> alter table db5.t2 import tablespace;  #导入表空间
mysql> select * from db5.t2;   #查看数据库

4,注意事项
  本次实验主要以mysql数据备份为主,本文仅供参考,如有技术问题请留言.

猜你喜欢

转载自blog.51cto.com/14050800/2320733