实验案例:
Mysql数据库冷备份,冷备份只能在数据库关闭的状态下才能备份!
创建一个名为“37db”的库
create database 37db;
在库里面在创建一个tset_tb的表
进入库
use 37db;
创建表:
create table test_tb(name char(50),passwd char(50));
查看有没有刚创建的库和表:
查看库:
show databases;可以看到有我刚创建的库
查看表:
show tables;可以看到我刚创建的表!
退出数据库!
开始冷备份,首先关闭mysql数据库!
mysqld.sh stop
在/目录下创建一个/backup的目录,作为备份数据存储路径,使用tar命令创建备份文件,属于完全备份!
mkdir /backup
tar -cjf /backup/mysql-37db-$(date +%F).tar.bz2 /usr/local/mysql/data/
模拟故障:
开启数据库
mysqld.sh start
登录数据库:
ysql -uroot -pP@ssw0rd
进入37db数据库
use 37db;
删除37db库里面的test_tb表
drop table test_tb;
使用show tables;查看到刚才建立的test_tb的表已经被删除!
然后关闭mysql数据库:
mysqld.sh stop(注意:这是做了优化路径后的命令)
在/backup目录下创建一个restort目录!
mkdir restore
然后把备份文件解压到restort目录下,加大写-C!
tar -xf mysql-37db-2019-09-26.tar.bz2 -C restore/
复制data/所有的文件到/usr/local/mysql/37db目录下
\cp /backup/restore/usr/local/mysql/data/37db/ /usr/local/mysql/data/37db
在开启数据库,登录数据库1
进入use 37db库,查看库里面的表有没有恢复回来!
可以看到之前删除的表已经恢复回来!
热备份与恢复:
我在37db库里创建一个benet_tb的表!
备份完整的库:
ysqldump -u root -pP@ssw0rd --databases 37db > /backup/mysql-37db.sql
备份到/backup目录下,文件名为mysql-37db.sql,会暴个错误信息,
意思是警告:在命令行界面上使用密码可能不安全。
然后删除37db库里面的表:
mysql -uroot -pP@ssw0rd -e ‘drop table 37db.benet_tb;’
查看benet_tb表示否存在:
mysql -uroot -pP@ssw0rd -e ‘use 37db;show tables;’
从备份当中恢复:
mysql -uroot -pP@ssw0rd 37db < /backup/mysql-37db.sql
mysql -uroot -pP@ssw0rd -e ‘use 37db;show tables;’
表已经恢复回来了,说明热备已经完成了!
Mysql企业备份案例:
创建一个名为client的库:
create database client;
在client库里创建名为user_info的表:
create
创建用户信息往user_info表里面插入三条用户大数据:
mysql> create table user_info(身份证 char(20) not null,姓名 char(20) not null,性别 char(4),用户ID号 char(10) not null,资费 int(10));
mysql> insert into user_info values(‘000006’,‘张三’,‘男’,‘016’,‘10’);
mysql> insert into user_info values(‘000006’,‘李四’,‘女’,‘017’,‘91’);
mysql> insert into user_info values(‘000008’,‘王五’,‘女’,‘018’,‘23’);
查看user_info表里面的数据:
select * from user_info;
进行增量备份需要首先开启二进制日志功能:
Vim /etc/my.cnf
添加:log-bin=/usr/local/mysql/mysql-bin
保存退出!
然后重启mysql服务:
mysqld.sh restart
可以在指定路径下查看二进制日志文件
ls -l /usr/local/mysql/mysql-bin.*
为方便验证二进制日志的增量恢复功能,我在插入三条用户数据后先对client数据库的user_info表 进行一次完全备份。
创建一个名为mysql_bak的目录:
mkdir /mysql_bak
执行“lush logs”生成新的二进制日志:
继续录入新的数据并进行增量备份:
刷新二进制日志,进行增量备份。
mysqladmin -uroot -pP@ssw0rd flush-logs
这样,二进制日志文件mysql/mysql-bin.000003中仅保留插入两个用户数据的操作!
复制mysql/mysql-bin.000002到/mysql_bak目录下!
cp /usr/local/mysql/mysql-bin.000002 /mysql_bak/
模拟误操作删除user_info表!
mysql -uroot -pP@ssw0rd -e ‘drop table client.user_info;’
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
恢复操作:
需要先恢复完全备份,然后再恢复增量备份。
恢复完全备份:
mysql -uroot -pP@ssw0rd client < /mysql_bak/client_userinfo-2019-09-26.sql
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
恢复成功
恢复增备份:
mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 | mysql -uroot -pP@ssw0rd
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
恢复成功
基于位置恢复
模拟故障与恢复操作
mysql -uroot -pP@ssw0rd -e ‘drop table client.user_info;’ (删除)
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’ (查看)
mysql -uroot -pP@ssw0rd client < /mysql_bak/client_userinfo-2019-09-26.sql (完全备份)
使用mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002查看二进制日志文件!
mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002
文件里面的内容:
At 459 称之为操作ID
操作ID下面跟着是时间标记
执行以下命令实现仅恢复到操作ID为“459”之前的数据,即不恢复“孙七“信息,这时所恢复的数据是从二进制日志文件打开始位置直到指定位置!
mysqlbinlog --no-defaults --stop-position=‘459’ /mysql_bak/mysql-bin.000002 | mysql -uroot -pP@ssw0rd
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
stop-position:指定的是停止的位置
使用-- start-position选项指定开始恢复数据的位置,这时所恢复的数据是从指定 位置开始直到二进制日志文件的最后!
mysql -uroot -pP@ssw0rd -e ‘drop table client.user_info;’
mysql -uroot -pP@ssw0rd client < /mysql_bak/client_userinfo-2019-09-26.sql
mysqlbinlog --no-defaults --start-position=‘459’ /mysql_bak/mysql-bin.000002 | mysql -uroot -pP@ssw0rd
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
基于时间点恢复:
基于时间点恢复数据使用的选手是” --stop-position”,指定的时间同样是查询二进制日志所得,以下命令可以实现仅恢复到19:52:32之前的数据,即不恢复“孙七”的信息!
mysql -uroot -pP@ssw0rd -e ‘drop table client.user_info;’
mysql -uroot -pP@ssw0rd client < /mysql_bak/client_userinfo-2019-09-26.sql
mysqlbinlog --no-defaults --stop-datetime=‘2019-09-26 19:52:32’ /mysql_bak/mysql-bin.000002 | mysql -uroot -pP@ssw0rd
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’
执行以下操作实现仅恢复“孙七”的信息,跳过“赵六”的信息恢复。
mysql -uroot -pP@ssw0rd -e ‘drop table client.user_info;’
mysql -uroot -pP@ssw0rd client < /mysql_bak/client_userinfo-2019-09-26.sql
mysqlbinlog --no-defaults --start-datetime=‘2019-09-26 19:52:32’ /mysql_bak/mysql-bin.000002 | mysql -uroot -pP@ssw0rd
mysql -uroot -pP@ssw0rd -e ‘select * from client.user_info;’