重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1 数据备份与恢复
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的枣庄网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
1 数据备份与恢复
1.1 数据备份方式
物理备份:直接拷贝库或者表对应的文件。cp,tar, ...
具有局限性,前提是表的存储引擎为myisam,跨平台性差,数据备份恢复浪费时间。
逻辑备份:执行备份时,根据已有的数据,生成对应的sql命令,把sql保存到指定的文件里。恢复时执行备份文件里的sql命令。
1.2 数据备份策略
完全备份:备份所有数据。
增量备份:备份自上一次备份之后有变化的数据
差异备份:备份自完全备份之后有变化的数据
完全备份+增量备份
完全备份+差异备份
1.3 完全备份
备份命令:
[root@ser51 ~]#MySQLdump -hlocalhost -uroot -p密码 源库名 >文件名
源库名的表示:
--all-databases 所有库
库名 指定单个库
库名 表名 指定库的表(注意库名和表名之间是空格)
-B 数据库1 数据库2 备份多个库
恢复命令:
两种方式:
(1)[root@ser51 ~]#mysql 连接库操作 目标库名 <文件名.sql
(2)mysql>source 备份文件路径;
1.4 增量备份
(1)启用binlog日志 实现实时增量备份
binlog日志介绍:二进制日志,是mysql数据库服务日志文件中的一种,记录执行的除查询之外的sql命令。默认没有启用。
vim /etc/my.cnf
[mysqld]
server_id=数值 #数值范围1-255
log_bin #启用默认存放路径/var/lib/mysql/
binlog_format="mixed"
重启服务之后生成的文件为:
/var/lib/mysql/主机名-bin.000001
#超过500M生成新的(000001-999999)
/var/lib/mysql/localhost-bin.index #索引文件
#systemctl restart mysqld #重启服务
(2)查看日志当前记录格式
mysql > show variables like "binlog_format";
三种记录格式:
statement:每一条修改数据的sql命令都会记录在binlog日志中;
row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。;
mixed:是以上两种格式的混合使用。
(3)查看binlog日志文件内容
#mysqlbinlog /var/lib/mysql/localhost-bin.000001
# mysqlbinlog localhost-bin.000001 | grep -i insert
(4)自定义binlog日志文件存储的目录和文件名
# mkdir /logdir
# chown mysql /logdir; setenforce 0
#vim /etc/my.cnf
server_id=数值 #数值范围1-255
log_bin=/logdir/mysql
#自定义存放路径(mysql相当于主机名,必须写,无需mkdir)
binlog_format="mixed"
#systemctl restart mysqld
#ls /logdir/
(5)分析binlog日志
binlog日志文件记录sql命令的方式?
时间点
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
pos点(偏移量)
--start-position=数字
--stop-position=数字
[root@ser51 logdir]# mysqlbinlog
--start-position=336 --stop-position=1494 mysql.000001
(6)执行binlog日志里的sql命令恢复数据
#mysqlbinlog [选项] 日志文件名 | mysql -uroot -p123qqq
#mysqlbinlog --start-position=300 --stop-position=1006 /var/lib/mysql/localhost-bin.000001 | mysql -uroot -p123456
(7)手动生成新的binlog日志
第1种:mysql> flush logs; #刷新一次生成一次
第2种:mysql -uroot -p123qqq -e "flush logs"
#-e就是以mysql登录方式执行sql命令
第3种:# systemctl restart mysqld
第4种:#mysqldump -uroot -p123qqq --flush-logs teadb t7 > /databak/t7.sql #备份的时候重新生成
(8)删除已有的binlog日志文件
第1种:mysql> reset master; #重置所有
第2种:mysql> purge master logs to "binlog文件名";
#删除指定binlog之前的日志
第3种:#rm -rf binlog日志文件
2.1 安装Percona
一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。
主要含两个组件:
xtrabackup:
innobackupex:
[root@ser51 ~]# yum -y install perl-Digest-MD5 perl-DBD-MySQL
#环境不一样安装的依赖包不一样
[root@ser51 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
[root@ser51 ~]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
2.2 innobackupex完全备份
(1) 基本选项:
--host --user --port --password --databases=
--no-timestamp #不用日期命名备份文件存储的子目录名
--redo-only#日志回滚合并,最后一次增量备份日志回滚不需要此项
--apply-log#准备还原(回滚日志)
--copy-back#恢复数据
--incremental目录名 #增量备份存放的路径
--incremental--basedir=目录名
#增量备份时,指定上一次备份数据存储的目录名
--incremental--dir=目录名 #恢复数据时,指定增量备份数据存储的目录名
--export #导出表信息
import #导入表空间
恢复数据的时候要求数据库目录必须是空的(/var/lib/mysql)
(2) 使用innobackupex做完全备份和完全恢复
案例:完全备份到/allback中
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" /allback
#databases:要备份的数据库名 /allback创建的时候自动生成,无需创建
[root@ser51 ~]#ls /allback/2018-01-22_21-19-33/
#查看生成的备份文件
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --apply-log /allback/2018-01-22_21-19-33
#同步日志
[root@ser51 ~]#rm -rf /var/lib/mysql/ #恢复时要求清空
[root@ser51 ~]#mkdir /var/lib/mysql #创建新的
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --copy-back /allback/2018-01-22_21-19-33
#恢复数据
[root@ser51 ~]#ls -ld /var/lib/mysql #查看目录的属性
[root@ser51 ~]#chown -R mysql:mysql /var/lib/mysql
#更改为所有者,属组为mysql
[root@ser51 ~]#systemctl restart mysqld #重启服务
[root@ser51 ~]#mysql -uroot -p123456 #进入查看是否恢复成功
如果服务没有成功?
mv /etc/my.cnf /etc/my.cnf.back
mysql_install_db --user=mysql --datadir=/var/lib/mysql
2.3 innobackupex增量备份
(1) 条件
必须有一次完全备份,本例以备份到/onedir为例
第一次增量备份到/new1dir中
第二次增量备份到/new2dir中
(2)增量备份
第一步:完全备份
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" /onedir --no-timestamp
第二步:改变db66数据库表中的数据
进行第一次的增量备份到/new1dir
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental /new1dir --incremental-basedir=/onedir --no-timestamp
#增量备份时,指定上一次备份数据存储的目录名
第三步:再次改变db66数据库表中的数据
进行第二次的增量备份到/new2dir
[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
第四步:数据恢复
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir #恢复完全备份日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir/ --incremental-dir=/new1dir
#恢复增量日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"
--apply-log --redo-only /onedir/ --incremental-dir=/new2dir
#恢复增量日志
[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --copy-back /onedir #恢复文件
[root@ser51 ~]# chown -R mysql:mysql /var/lib/mysql/
[root@ser51 ~]# systemctl restart mysqld
登录数据库查看数据是否恢复
2.4 增量备份原理:
在/var/lib/mysql/下存在事务日志ib_logfile0 和ib_logfile1 ibdata1
备份之后同步日志会在新的备份的文件内存在以下两个文件:
xtrabackup_checkpoints #存在lsn:日志序列号
xtrabackup_logfile #日志文件
每一次的增量恢复日志时,会和完全备份的日志进行合并,并且日志序列号会发生变化,这个变化记录了合并的序列号位置,同时会把增量备份的数据合并到完全备份中。
[root@ser51 ~]# cat /onedir/xtrabackup_checkpoints
[root@ser51 ~]# cat /new1dir/xtrabackup_checkpoints
[root@ser51 ~]# cat /new2dir/xtrabackup_checkpoints
2.5恢复完全备份数据中的某张表
(1)删除表空间命令
mysql> alter table 库.表 discard tablespace;
(2)前提完全备份的数据库:
#innobackupex --user root --password 123456 --databases="db66" /db66bak --no-timestamp
#ls /db66bak
(3)mysql> use db66;
mysql> drop table a; #删除表a,对表a操作恢复的过程
mysql> create table a(id int); # 建空表,表字段信息必须和原来一致
#ls /var/lib/mysql/db66/
a.frm a.ibd
(4)导出表信息
#innobackupex --user root --password 123456
--databases="db66" --apply-log --export /db66bak
#ls /db66bak/db66/ #查看发生了什么变化
(5)删除表空间
mysql> alter table db66.a discard tablespace;
#ls /var/lib/mysql/db66/
(6)把备份目录下导出的表信息文件拷贝到数据库目录下
# cp /db66bak/db66/a.{cfg,exp,ibd} /var/lib/mysql/db66/
(7)修改文件所有者
# chown mysql /var/lib/mysql/db66/a.*
(8)导入表空间
mysql> alter table db66.a import tablespace;
mysql> select * from a;
mysql> select * from b;