欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

MySQL-备份与还原

程序员文章站 2022-11-26 20:10:49
前言 对于我们运维来说,在mysql数据库领域,别的不说,最起码要会两大技能! 第一大技能:备份与还原 第二大技能:主从异步 关于这两大技能我们先来说说第一个 备份与还原 备份:我们按时定点来备份数据,当下数据最值钱,所以我们要确保数据的安全。 平常我们都是7天一大备,三天两头一小备,也就是说,一周 ......

 

前言

对于我们运维来说,在mysql数据库领域,别的不说,最起码要会两大技能!

第一大技能:备份与还原

第二大技能:主从异步

关于这两大技能我们先来说说第一个

备份与还原

备份:我们按时定点来备份数据,当下数据最值钱,所以我们要确保数据的安全。

平常我们都是7天一大备,三天两头一小备,也就是说,一周来一个完全备份,1、2、天来一个增量或差异备份。

确保那天服务器宕机或误操作,能恢复过来。

还原:当服务器负重过量会导致宕机,或有时候我们误操作,删除了某张重要的数据表等等,这时候就要用到我们之前备份的数据来恢复。

简单说下备份的类型,

冷备:读写操作均不可进行

温备:读操作可执行;但写操作不可执行

热备:读写操作均可执行

MyISAM:温备,不支持热备
InnoDB: 都支持

简单说下常用的备份工具,

LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份

mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份

xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份

备注:以上除了xtrabackup,都是基于完整备份包以及二进制日志来恢复数据库的,二进制日志记录了增删改语句的操作指令,拿过来重放,

建议:建议二进制日志和数据文件分开存放 --

1、关闭网络链接,只监听本地端口访问,(在备份还原的时候用)

skip-networking=1

2、禁止主机名解析,ip地址访问的时候,禁止反向解析(建议加上)

skip_name_resolve = on

3、每个表单独使用一个表空间存储表的数据和索引(建议加上)

innodb_file_per_table = on

4、开启并指定二进制文件存放位置

log_bin=/...

。。。

准备

1、准备两台主机,我用.17充当mysql主服务器,.57来还原用。

2、17主mysql数据库有以下几个表

3、目录

/data/mysq/:下存放数据库数据

/app/logs/:下存放二进制日志

。。。

实战

备份阶段

1、完全备份

mysqldump -pcentos -A -F --master-data=2 --single-transaction |gzip > /data/all-`date +%F`.sql.gz

备注:

-A:备份全部数据库

-F:切换二进制日志

--master-data=2:记录了基于二进制那个位置备份的,这个点之后是新数据,备份结束点

--single-transaction:保证数据的一致性

2、解压并查看

gzip -d all-2018-08-03.sql.gz
less all-2018-08-03.sql

备注:记住这个文件以及数字,一会还原的时候要用

3、修改students表(新数据和日志)

1)没修改前

2)加记录

insert students (name,age)values('gaoda1hao',20);


3)查看现在的二进制变化

4)假设现在这台mysql服务器宕机崩溃了,下面开始还原

。。。

还原阶段

上面规划的是用57这台主机来还原,首先这台主机必须是干净的mysql数据库

1、scp传送

1)传送完全备份文件到目标主机

scp all-2018-08-03.sql 192.168.43.57:

2)传送上面图中00005文件以及之后的二进制文件到目标主机

scp mysql-bin.000005 192.168.43.57:

2、57主机来还原

注意:还原的时候要禁止除了你之外的所有用户的访问。

停止mysql服务,在my.cnf配置文件中可以加上上面说到一项

1)开启服务前提下并完全备份数据包

mysql < all-2018-08-03.sql

备注:现在只还原到了,备份时的状态,下面再次还原备份后到宕机这段时候发生的操作

2)导入二进制日志

mysqlbinlog  --start-position=385 /root/mysql-bin.000005 > /app/binlog.sql

备注:把00005中从385开始的指令语句导入到一个文件中

mysql < /app/binlog.sql

备注:导入二进制记录的指令

。。。

验证

1、看表存在不

2、看表数据正不正确

OK 还原成功

 

下面再来演示一个案例-误删除表的恢复

比如我们在某天的12点中做了完全备份,在下一次做完全备份中间有一天执行了删除某张表,删除后等了几个小时才发现表删除了,

在这种场景下,来恢复数据,下面来模拟下。

模拟顺序:完全备份--用户对表的数据修改--删除某张表--未发现用户继续对其他表操作--当访问被删除的表时发现--

准备工作和上面一样,下面进入正题

前几步和前面一样

1、完全备份

mysqldump -pcentos -A -F --master-data=2 --single-transaction |gzip > /data/all-`date +%F`.sql.gz

2、模拟误删除表前的修改

insert students (name,age)values('gaoda1hao',20);

。。。

备注:这期间加了好多数据,可能二进制文件已经满了,进行了切换

3、模拟二进制文件的切换

flush logs;
#

接着增加几条记录

insert students (name,age)values('gaoda2hao',22);

4、模拟误删除数据表

drop table students;

备注:删除后还么有发现,接着增加其他表的数据

insert teachers (name,age)values('gaoda3',30);

5、发现问题并及时禁止用户写权限(只能读)

flush tables with read lock;

备注:现在只能root用户可以读写其他用户是不能修改数据的

。。。

6、干净系统还原

1)停止服务

systemctl stop mairadb


2)删除所有mysql数据库数据

rm -rf /var/lib/mysql/

3)确保用户不能访问服务器 配置文件加上

skip-networking

4)启动服务

 

7、还原完全备份

1)解压完全备份包

gzip -d all-2018-08-03.sql.gz

2)查看解压的文件确定位置

less all-2018-08-03.sql

3)把完整备份传送到57目标主机还原

mysql <all-2018-08-03.sql

8、还原增量备份

1)合并00004以及之后的二进制日志文件

mysqlbinlog  --start-position=385 mysql-bin.000004 > /data/binlogs.sql
mysqlbinlog   mysql-bin.000005 >> /data/binlogs.sql
mysqlbinlog   mysql-bin.000006 >> /data/binlogs.sql

2)从合并的二进制日志文件中找到误操作的指令删除或注释

3)scp传送到57目标主机还原

mysql <binlogs.sql

。。。

验证

1、删除的表看看有了没

2、在表删除后其他的表改的记录还在不

OK

还原成功

欢迎补充--