数据备份与恢复
[root@mysql150 ~]# mkdir /dbbak
[root@mysql150 ~]# cp -rp /var/lib/mysql/ /dbbak/mysql.bak
[root@mysql150 ~]# ls /dbbak/
mysql.bak
[root@mysql150 ~]# scp -r /dbbak/mysql.bak/ 192.168.4.51:/root
[root@mysql151 ~]# systemctl stop mysqld
[root@mysql151 ~]# rm -rf /var/lib/mysql
[root@mysql151 ~]# cp -r /root/mysql.bak /var/lib/mysql
[root@mysql151 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql151 ~]# systemctl restart mysqld
[root@mysql151 ~]# mysql -u root -p123456
注意:物理不常用。
数据备份策略
3.1.2 启用binlog日志
]#vim /etc/my.cnf
[mysqld]
server_id=51 //指定的id
log-bin[=目录名=文件名]
binlog-format="mixed" [row、statement] //会有两个文件生成
]# systemctl restart mysqld
]# ls /var/lib/mysql/主机名-bin.000001
]# cat /var/lib/mysql/主机名-bin.index
3.1.3 查看binlog日志文件内容
]#mysqlbinlog /var/lib/mysql/mysql51-bin.000001
可以自定义binlog日志文件存储的位置和文件名称
]#mkdir /mylog
]#chown mysql /mylog
]#setenforce 0
]#vim /etc/my.cnf
[mysqld]
server_id=51
#log-bin
log-bin=/mylog/plj
binlog-format="mixed"
]# systemctl restart mysqld
]#ls /mylog/plj.*
xxx.000001 xxx.index
3.1.4 手动生成新的日志文件方法
默认日志文件大于500M时自动创建新日志文件
]# systemctl restart mysqld
mysql> flush logs; //刷新数据日志,每次刷新都会xxx.000001自增+1
]# mysql -uroot -p密码 -e “flush logs”
]# mysqldump -uroot -p密码 --flush-logs 库名 > 目录/xx.sql //等同于flush logs,每次刷新都会xxx.000001自增+1
3.1.5 删除已有的日志文件
mysql> reset master; //删除所有的日志文件重新生成第一个日志文件
mysql> purge master logs to “日志名”; //删除指定日志文件之前的日志文件
3.1.6 binlog日志记录sql命令方式
记录方式有2种: 偏移量 、记录sql命令执行的时间
指定偏移量范围选项
–start-position=偏移量的值
–stop-position=偏移量的值
指定时间范围选项
–start-datetime=“yyyy-mm-dd hh:mm:ss”
–stop-position=“yyyy-mm-dd hh:mm:ss”
++++++++++++++++++++++++
使用binlog恢复日志
读取日志文件指定范围内的sql命令恢复数据。
]# mysqlbinlog --start-position=293 --stop-position=1450 plj.000001 | mysql -uroot -p654321
mysql> create database keydb;
mysql> create table keydb.key(id int);
mysql> insert into keydb.key values(122),(123);
mysql> drop database keydb;
]# cd /mylog
]# mysqlbinlog /mylog/fan.00000.1 | grep -i create
]# mysqlbinlog fan.000001
:找到偏移量的起始值和末尾值
]#mysqlbinlog --start-position=316 --stop-position=1032 fan.000001
]#mysqlbinlog fan.000001 | mysql -u root -p123456
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| db4 |
| gamedb |
| keydb |
| mysql |
| performance_schema |
| press |
| school |
| sys |
| userdb |
±-------------------+
10 rows in set (0.00 sec)
mysql> select * from keydb.key;
]#mysqlbinlog --start-position=偏移量的值
–stop-position=偏移量的值 日志文件名 | mysql -uroot -p654321
]# innobackupex --user root --password 123456 /allbak --no-timestamp \不以系统时间完全备份到allbak目录下
恢复
mysql> drop database db5;
]# systemctl stop mysqld
准备恢复数据
]#innobackupex --apply-log /allbak
]# cat xtrabackup_checkpoints
backup_type = full-backuped //只有full-backuped才能拷贝数据
]#innobackupex --copy-back /allbak //把备份文件拷贝到数据库目录下,会报错,因为目录下不为空
报错信息:Failed to connect to MySQL server: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2).
]# rm -rf /var/lib/mysql
]# mkdir /var/lib/mysql
]#innobackupex --copy-pack /allbak //把备份文件拷贝到数据库目录下,再次拷贝就会成功
或者
]#innobackupex -u root -p123456 --copy-back /allbak/ //把备份文件拷贝到数据库目录下
]# chown -R mysql:mysql /var/lib/mysql //修改数据库目录的所有者和组用户为mysql
]#systemctl start mysqld //启动mysql服务
管理员登陆查看数据
]# mysql -u root -p123456
mysql> select * from db5.a;
]# innobackupex --user root --password 123456 /fullbak --no-timestamp \不以系统时间完全备份到fullbak目录下
]# ls /fullbak
]# cat xtrabackup_checkpoints
backup_type = full-backuped
mysql> insert into db5.a values(888);
]# innobackupex --user root --password 123456 --incremental /new1 --incremental-basedir=/fullbak --no-timestamp
]# innobackupex --user root --password 123456 --incremental /new2 --incremental-basedir=/fullbak --no-timestamp
]# ls /new1
backup-my.cnf ibdata1.delta performance_schema xtrabackup_checkpoints
db5 ibdata1.meta sys xtrabackup_info
ib_buffer_pool mysql xtrabackup_binlog_info xtrabackup_logfile
]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3143557
to_lsn = 3145818
last_lsn = 3145827
compact = 0
recover_binlog_info = 0
]# ls /new2
backup-my.cnf ibdata1.delta performance_schema xtrabackup_checkpoints
db5 ibdata1.meta sys xtrabackup_info
ib_buffer_pool mysql xtrabackup_binlog_info xtrabackup_logfile
]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 3143557
to_lsn = 3145818
last_lsn = 3145827
compact = 0
recover_binlog_info = 0
增量恢复数据
1)准备恢复
mysql> drop database db5;
]# systemctl stop mysqld
]# innobackupex --apply-log --redo-only /fullbak
2)合并日志
]# innobackupex --apply-log --redo-only /fullbak --incremental-dir=/new1
]# innobackupex --apply-log --redo-only /fullbak --incremental-dir=/new2
3)把备份文件拷贝回数据库目录下
]# rm -rf /var/lib/mysql/*
]# innobackupex --copy-back /fullbak
]# rm -rf /new1
]# rm -rf /new2
#日志合并了之后new1、2下的文件就没用了,可以删除
4)修改目录的所有者和组为mysql用户
]# chown -R mysql:mysql /var/lib/mysql
5)启动服务,登陆验证
]# systemctl start mysqld
mysql> select * from db5.a;
恢复某一张表的数据
1)导出表信息
]# innobackupex --user root --password 123456 --apply-log --export /db5bak
]# ls /db5bak/db5
mysql> drop table db5.b; //删除表
2)创建删除的表(要和原来的表结构一样)
mysql> create table db5.b(name char(10));
3)删除表空间
mysql> alter table db5.b discard talespace;
4)把导出的表信息文件拷贝到数据库目录下 并修改所有者所属组为mysql
mysql> system cp /db5bak/db5/b.{cfg,exp,ibd} /var/lib/mysql/db5
mysql> system chown mysql:mysql /var/lib/mysql/db5/b.*
5)导入表信息
mysql> alter table db5.b import tablespace;
mysql> select * from db5.b;
mysql> system rm -rf /var/lib/db5/b.cfg
mysql> system rm -rf /var/lib/db5/b.exp