MySQL完全备份与恢复

InnoDB 存储引擎的数据库在磁盘上存储成三个文件: db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)。

1.物理冷备份与恢复 systemctl stop mysqld yum -y install xz #压缩备份 tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/ mv /usr/local/mysql/data/ /opt/ #解压恢复 tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data/ cd /usr/local/mysql/data mv /usr/local/mysql/data/* ./

  1. mysqldump 备份与恢复(温备份) create table info2 (id int,name char(10),age int,sex char(4)); insert into info2 values(1,'user',11,'性别'); insert into info2 values(2,'user',11,'性别');

(1)、完全备份一个或多个完整的库 (包括其中所有的表) mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql #导出的就是数据库脚本文件 例: mysqldump -u root -p --databases kgc > /opt/kgc.sql #备份一个kgc库 mysqldump -u root -p --databases mysql kgc > /opt/mysql-kgc.sql #备份mysql与 kgc两个库

(2)、完全备份 MySQL 服务器中所有的库 mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql 例: mysqldump -u root -p --all-databases > /opt/all.sql

(3)、完全备份指定库中的部分表 mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql 例: mysqldump -u root -p [-d] kgc info1 info2 > /opt/kgc_info1.sql #使用“-d”选项,说明只保存数据库的表结构 #不使用“-d"选项,说明表数据也进行备份 #做为一个表结构模板

(4)查看备份文件 grep -v "^--" /opt/kgc_info1.sql | grep -v "^/" | grep -v "^$"

-----------Mysql 完全恢复 #恢复数据库 1.使用mysqldump导出的文件,可使用导入的方法 source命令 mysql命令

2.使用source恢复数据库的步骤

登录到MySQL数据库 执行source备份sql脚本的路径

3.source恢复的示例

MySQL [(none)]> source /backup/all-data.sql

使用source命令恢复数据 1.模拟数据库出现问题

mysql -uroot -pabc123 登录数据库 mysql> show databases; 查看数据库信息 mysql> drop database school; 删除数据库school mysql> show databases;

恢复数据表

mysq mysql> select * from info; 查询所有字段 mysql> show tables; 查看表信息

PS:mysqldump 严格来说属于温备份,会需要对表进行写入的锁定 在全量备份与恢复实验中,假设现有ky13库,ky13库中有一个test表,需要注意的一点为: ① 当备份时加 --databases ,表示针对于ky13库 #备份命令 mysqldump -uroot -p123123 --databases school > /opt/school_01.sql 备份库后 #恢复命令过程为: mysql -uroot -p123123 drop database ky13; exit mysql -uroot -p123123 < /opt/ky13_01.sql ② 当备份时不加 --databases,表示针对ky11库下的所有表 #备份命令 mysqldump -uroot -p123123 ky13 > /opt/ky11_all.sql #恢复过程: mysql -uroot -p123123 drop database ky13; create database ky13; exit mysql -uroot -p123123 ky13 < /opt/ky11_02.sql

#查看ky11_01.sql 和ky11_02.sql 主要原因在于两种方式的备份(前者会从"create databases"开始,而后者则全是针对表格进行操作)

4.在生产环境中,可以使用Shell脚本自动实现定时备份(时间频率需要确认)

0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -pabc123 kgc info1 > ./kgc_infol_$(date +%Y%m%d).sql ;/usr/local/mysql/bin/mysqladmin -u root -p flush-logs

MySQL 增量备份与恢复

MySQL数据库增量恢复 1.一般恢复

将所有备份的二进制日志内容全部恢复

2.基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作 发生错误节点之前的一个节点,上一次正确操作的位置点停止

3.基于时间点恢复

跳过某个发生错误的时间点实现数据恢复 在错误时间点停止,在下一个正确时间点开始

MySQL 增量备份

一、增备实验 1.开启二进制日志功能 vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入) server-id = 1 #可加可不加该命令

#二进制日志(binlog)有3种不同的记录格式: STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

① STATEMENT(基于SQL语句): 每一条涉及到被修改的sql 都会记录在binlog中 缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题

总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底

② ROW(基于行) 只记录变动的记录,不记录sql的上下文环境 缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大

总结:update、delete以多行数据起作用,来用行记录下来, 只记录变动的记录,不记录sql的上下文环境, 比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低 比较大所以记录都记下来,

③ MIXED 推荐使用 一般的语句使用statement,函数使用ROW方式存储。

systemctl restart mysqld

查看二进制日志文件的内容 cp /usr/local/mysql/data/mysql-bin.000002 /opt/

① mysqlbinlog --no-defaults /opt/mysql-bin.000002

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows) #-v: 显示详细内容 #--no-defaults : 默认字符集(不加会报UTF-8的错误) PS: 可以将解码后的文件导出为txt格式,方便查阅 mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000002

二进制日志中需要关注的部分 1、at :开始的位置点 2、end_log_pos:结束的位置 3、时间戳: 210712 11:50:30 4、SQL语句

2.进行完全备份(增量备份时基于完全备份的,所以我们直接完全备份数据库) [root@mysql data]# mysqldump -uroot -p school info > /opt/kgc_info1$(date +%F).sql [root@mysql data]# mysqldump -uroot -p123123 school > /opt/school_all$(date +%F).sql

3.可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000002) mysqladmin -u root -p flush-logs

4.插入新数据,以模拟数据的增加或变更 PS:在第一次完全备份之后刷新二进制文件,在第二个二进制文件中记载着"增量备份的数据"

5.再次生成新的二进制日志文件(例如:mysql-bin.000003) mysqladmin -u root -p flush-logs #之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后我们测试删除ky13库的操作会保存在mysql-bin.000003文件中 (以免当我们基于mysql-bin.000002日志进行恢复时,依然会删除库)

MySQL增量恢复 1.一般恢复 (1)、模拟丢失更改的数据的恢复步骤(直接使用恢复即可) ① 备份ky11库中test1表 mysqldump -uroot -p123123 ky13 test1 > /opt/ky13_test13.sql ② 删除ky13库中test1表 drop table ky13.test1; ③ 恢复test1表 mysql -uroot -p ky13 < info-2020-08-31.sql

#查看日志文件 [root@mysql data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002

(2)、模拟丢失所有数据的恢复步骤 ① 模拟丢失所有数据

② 基于mysql-bin.000002恢复 mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

2.断点恢复 mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

#需求:以上id =4的数据操作失误,需要跳过

② 确认位置点,刷新二进制日志并删除test1表 mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000003 960 停止 1066 开始

#刷新日志 mysqladmin -uroot -p123123 flush-logs

③ 基于位置点恢复 #仅恢复到操作 ID 为“623"之前的数据,即不恢复"user4"的数据 mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

#仅恢复"user4"的数据,跳过"user3"的数据恢复 mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

mysqlbinlog --no-defaults --start-position='400' --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p #恢复从位置为400开始到位置为623为止

(2)、基于时间点恢复 mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码

#仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据 mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p

#仅恢复"user4"的数据,跳过"user3"的数据恢复 mysqlbinlog --no-defaults --start-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p

如果恢复某条SQL语之前的所有数据,就stop在这个语句的位置节点或者时间点 如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start

你可能感兴趣的:(云计算课程学习,数据库,adb)