数据备份与恢复 、
数据备份与恢复
1 为什么要备份数据?
数据丢失或误删除时,使用备份文件恢复数据。
2 数据备份方式?
物理备份? 备份库或表对应文件
cp -r /var/lib/mysql/mysql /opt/mysql.bak
cp /var/lib/mysql/mysql/user.* /opt/
tar -zcvf /opt/mysql.tar.gz /var/lib/mysql/mysql/*
164 cp -r /mydata/mysql.bak/ /var/lib/mysql/mysql
165 chown -R mysql:mysql /var/lib/mysql/mysql
166 systemctl restart mysqld
逻辑备份?备份时根据已有的库表及记录生成对应的sql命令,把
sql保存到指定的备份文件里
3数据备份策略?
完全备份 备份所有数据(一台服务器 一个库 一张表)
差异备份 备份自完全备份后所有新产生
增量备份 备份自上一次备份后所有新产生
完全备份+差异备份
完全备份+增量备份
4在生成环境下如何实现数据备份
周期性计划任务 执行 备份脚本
00 18 * * 1 sh /shell/allbak.sh
5 数据备份时要考虑因素?
备份方式 逻辑备份
备份策略 ?完全 差异 增量
数据备份频率? 1 小时 1天 1周
数据备份的时间? 数据访问量小的时候执行备份
存储空间可扩展? LV
备份文件命名要有标识性? 使用日期做备份文件名
完全备份+差异备份
时间 t1 名
18:00
1 完全 10 1.sql 10
2 差异 3 2.sql 3
3 5 3.sql 8
4 6 4.sql 14
5 1 5.sql 15
6 2 6.sql 17
7 差异 3 7.sql 20
完全备份+增量备份
时间 t1 名
18:00
1 完全 10 1.sql 10
2 增量 3 2.sql 3
3 5 3.sql 5
4 6 4.sql 6
5 1 5.sql 1
6 2 6.sql 2
7 增量 3 7.sql 3
完全备份
时间 t1 名
18:00
1 完全 10 1.sql 10
17:00
2 3 2.sql 13
3 5 3.sql 18
4 6 4.sql 24
5 1 5.sql 25
6 2 6.sql 27
7 3 7.sql 30
++++++++++++++++++++++++++++++++++
完全备份
#mysqldump -hlocalhost -uroot -p123qqq 数据库名
> 目录名/名.sql
数据库名的表示方式?
--all-databases 备份一台服务上的所有数据
数据库名 备份一个库里的所有表
数据库名 表名 备份一张表里的所有数据
-B 数据库名1 数据库名2 数据库名N 备份某几个库的所有数据
#mkdir /databak
#mysqldump -uroot -p123qqq userdb >
/databak/userdb.sql
#mysqldump -uroot -p123qqq teadb >
/databak/teadb.sql
完全恢复
#mysql -hlocalhost -uroot -p123qqq 数据库名 < 目录
名/名.sql
mysql>drop database teadb;
mysql>create database teadb;
#mysql -uroot -p123qqq teadb < /databak/teadb.sql
mysql> use teadb ; show tables;
#crontab -e
00 18 * * 1 /opt/teadbbak.sh &> /dev/null
00 18 * * 2-7 /opt/baknewbinlogfile.sh
vim /opt/baknewbinlogfile.sh
#!/bin/bash
备份每天新生成的binlog日志文件且正在使用的binlog日志文
件不备份
:wq
vim /opt/teadbbak.sh
#!/bin/bash
if [ ! -e /databak ];then
mkdir /databak
fi
day=`date +%F`
mysqldump -uroot -p123qqq --flush-logs teadb >
/databak/teadb-${day}.sql
:wq
# chmod +x /opt/teadbbak.sh
只使用完全备份策略备份数据的缺点:
a 使用完全备份文件恢复数据时只能把数据恢复到备份时的状态
,完全备份新产生的数据无法恢复。
b 备份和恢复数据时都会对表加写锁。
+++++++++++++++++++++++++++++++++++二
、增量备份(启用mysql服务binlog日志做时时增量备份、安装
第3方软件提供增量备份命令做备份)
2.1启用mysql服务binlog日志做时时增量备份
binlog日志 又叫二进制日志 ,是mysql数据服务日志文件的
一种,记录客户端连接数据库服务后,执行的除查询之外的sql
命令。
mysql -hx.x.x.x -uroot -p123456
mysql> select desc show tables
mysql> create insert update delete grant revoke
启用binlog日志
mysql > show variables like "binlog_format";
vim /etc/my.cnf
[mysqld]
server_id=12
log_bin
binlog_format="mixed"
:wq
#systemctl restart mysqld
mysql > show variables like "binlog_format";
ls /var/lib/mysql/主机名-bin.000001 500M+
ls /var/lib/mysql/localhost-bin.index 索引文件
查看binlog日志文件内容
#mysqlbinlog /var/lib/mysql/localhost-bin.000001
binlog日志文件记录sql命令的方式?
时间点
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
pos点
--start-position=数字
--stop-position=数字
执行binlog日志里的sql命令恢复数据
#mysqlbinlog [选项] 日志文件名 | mysql -uroot -
p123qqq
#mysqlbinlog --start-position=300 --stop-
position=1006 /var/lib/mysql/localhost-bin.000001 |
mysql -uroot -p123qqq
手动生成新的binlog日志?
mysql> flush logs;
# mysql -uroot -p123qqq -e "flush logs"
# systemctl restart mysqld
#mysqldump -uroot -p123qqq --flush-logs teadb t7 >
/databak/t7.sql
删除已有的binlog日志文件
mysql> reset master;
mysql> purge master logs to "binlog文件名";
#rm -rf binlog日志文件
自定义binlog日志文件存储的目录和文件名
# mkdir /logdir
# chown mysql /logdir
# setenforce 0
#vim /etc/my.cnf
server_id=12
#log_bin
log_bin=/logdir/plj
binlog_format="mixed"
:wq
#systemctl restart mysqld
#ls /logdir/
++++++++++++++++++++++++++++
2.3安装第3方软件percona提供增量备份命令做备份
一款强大的在线热备份工具
备份过程中不锁库表,适合生产环境
由专业组织Percona提供(改进MySQL分支)
主要含两个组件
xtrabackup:C程序,支持InnoDB/XtraDB
innobackupex:以Perl脚本封装xtrabackup,还支持
MyISAM
#yum -y install perl-DBD-MySQL perl-Digest-MD5
#rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
# rpm -ivh percona-xtrabackup-24-2.4.7-
1.el7.x86_64.rpm
# rpm -qa | grep percona
# rpm -ql percona-xtrabackup-24
#man innobackupex
#man xtrabackup
#innobackupex <选项>
1 innobackupex完全备份与恢复
#mkdir /pljdir
# innobackupex --user root --password 123qqq --
databases="teadb" /pljdir --no-timestamp
# innobackupex --user root --password 123qqq --
databases="teadb" --apply-log /pljdir
完全恢复
# cp -r /var/lib/mysql/mysql /opt/mysql.bak
#rm -rf /var/lib/mysql
#mkdir /var/lib/mysql
# innobackupex --user root --password 123qqq --
databases="teadb" --copy-back /pljdir
# cp -r /opt/mysql.bak /var/lib/mysql/mysql
# chown -R mysql:mysql /var/lib/mysql
#systemctl restart mysqld
备份目录下配置文件说明
backup-my.cnf
xtrabackup_checkpoints
xtrabackup_logfile
ibdata1
数据库 /var/lib/mysql/
事务日志文件
lsn 日志序列号
ib_logfile0
ib_logfile1
ibdata1
重新初始化数据库目录下的初始数据
#systemctl stop mysqld
#rm -rf /var/lib/mysql
vim /etc/my.cnf
[mysqld]
#validate_password_policy=0
#validate_password_length=6
:wq
#mysql_install_db --datadir=/var/lib/mysql --
user=mysql
#ls /var/lib/mysql/
#rm -rf /var/lib/mysql/mysql
#cp -r /opt/mysql.bak /var/lib/mysql/mysql
#chown -R mysql:mysql /var/lib/mysql/mysql
#systemctl start mysqld
2 innobackupex增量备份
完全备份 db101.t1 4---999
#innobackupex --user root --password 123456 --
databases="db101.t1" /fullbak --no-timestamp
第1次增量备份 8888
#innobackupex --user root --password 123456 --
databases="db101.t1" --incremental /new1dir --
incremental--basedir=/fullbak --no-timestamp
第2次增量备份 7777
#innobackupex --user root --password 123456 --
databases="db101.t1" --incremental /new2dir --
incremental--basedir=/new1dir --no-timestamp
增量恢复步骤
1 rm -rf /var/lib/mysql/
2 恢复日志信息
3 恢复数据
4 重启数据库服务
5 登录查看
增量恢复步骤
1 rm -rf /var/lib/mysql/
2 mkdir /var/lib/mysql
2 恢复日志信息
#innobackupex --user root --password 123456 --
databases="db106.t1" --apply-log --redo-only /onedir
#innobackupex --user root --password 123456 --
databases="db106.t1" --apply-log --redo-only /onedir
--incremental-dir="/dir2"
#innobackupex --user root --password 123456 --
databases="db106.t1" --apply-log --redo-only /onedir
--incremental-dir="/dir3"
3 恢复数据
#innobackupex --user root --password 123456 --
databases="db106.t1" --copy-back /onedir
4 重启数据库服务
#cp -r /root/mysql.plj /var/lib/mysql/mysql
#systemctl start mysqld
#chown -R mysql:mysql /var/lib/mysql
#systemctl stop mysqld
#systemctl start mysqld
5 登录查看
mysql -uroot -p123456
mysql> select * from db1.t1;
+++++++++++++++++++++++++++++++
3 使用完全备份文件恢复某个表的记录。
db106.a/b/t1
完全备份
#innobackupex --user root --password 123456 --databases="db106" /db106all --no-timestamp
#ls /db106all
#mysql -uroot -p123456
#drop table db106.a;
恢复某个表的记录
#innobackupex --user root --password 123456 --databases="db106" --apply-log --export /db106all
#ls /db106all/a.*
mysql> create table db106.a(id int);
mysql> alter table db106.a discard tablespace;
mysql> system cp /db106all/db106/a.{ibd,cfg,exp} /var/lib/mysql/db106/
mysql> system chown mysql:mysql /var/lib/mysql/db106/a.*
mysql> alter table db106.a import tablespace;
mysql > select * from db106.a;