数据库损坏了怎么办?——完全备份及恢复、增量备份及恢复

一、数据库备份的分类

1.数据备份的重要性

在生产环境中,数据的安全性至关重要
任何数据的丢失都可能产生严重的后果

造成数据丢失的原因:

  • 程序错误
  • 人为操作错误
  • 运算错误
  • 磁盘故障
  • 灾难(如火灾、地震)和盗窃

2.数据库备份的分类-1

从物理与逻辑的角度,备份可分为

  • 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
    • 物理备份方法
      • 冷备份(脱机备份):是在关闭数据库的时候进行的
      • 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
      • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
  • 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份

3.数据库备份的分类-2

从数据库的备份策略角度,备份可分为

  • 完全备份:每次对数据库进行完整的备份
  • 差异备份:备份自从上次完全备份之后被修改过的文件
  • 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份

4.常见的备份方法

物理冷备

  • 备份时数据库处于关闭状态,直接打包数据库文件
  • 备份速度快,恢复时也是最简单的

专用备份工具mydump或mysqlhotcopy

  • mysqldump常用的逻辑备份工具
  • mysqlhotcopy仅拥有备份MylSAM和ARCHIVE表

启用二进制日志进行增量备份

  • 进行增量备份,需要刷新二进制日志

第三方工具备份

  • 免费的MySQL热备份软件Percona XtraBackup

二、MySQL完全备份与恢复

1.MySQL完全备份-1

  • 是对整个数据库、数据库结构和文件结构的备份
  • 保存的是备份完成时刻的数据库
  • 是差异备份与增量备份的基础

2.MySQL完全备份-2

优点:

  • 备份与恢复操作简单方便

缺点:

  • 数据存在大量的重复
  • 占用大量的备份空间
  • 备份与恢复时间长

3.数据库完全备份分类

物理冷备份与恢复

  • 关闭MySQL数据库
  • 使用tar命令直接打包数据库文件夹
  • 直接替换先有MySQL目录即可

mysqldump备份与恢复

  • MySQL自带的备份工具,可方便实现对MySQL的备份
  • 可以将指定的库、表导出为SQL脚本
  • 使用命令mysql导入备份的数据

4.MySQL物理冷备份及恢复

数据库中的所有数据文件都在这个目录中,直接整个目录打包(需关闭数据库)
在这里插入图片描述

[root@server1 data]# systemctl stop mysqld //先关闭数据库
Redirecting to /bin/systemctl stop mysqld.service
[root@server1 data]# mkdir /opt/backup //创建备份目录,
[root@server1 data]# tar zcvf /opt/backup/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
//把整个数据目录打包
[root@server1 data]# cd /opt/backup
[root@server1 backup]# ll
总用量 1372
-rw-r--r--. 1 root root 1401279 1227 08:18 mysql_all_2020-12-27.tar.gz

当数据库故障(数据丢失)时,直接把压缩包解压,数据挪回data目录下

5.mysqldump备份数据库

5.1 单库进行完全备份及恢复

格式:

  • musqldump -u 用户名 -p【密码】【选项】【数据库名】 > 备份路径/备份文件名

单库备份示例:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kk                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
[root@server1 ~]# mysqldump -u root -p kk > /opt/kk.sql     #导出备份文件kk.sql
Enter password:          #输入密码
[root@server1 ~]# cd /opt/
[root@server1 opt]# ll
总用量 4
-rw-r--r--. 1 root root 1789 1227 05:30 kk.sql
drwxr-xr-x. 2 root root    6 326 2015 rh

备份完毕后可以查看kk.sql文件,可以看到没有备份创建数据库的语句,所以我们恢复的时候需要先创建原来的数据表,才可恢复
在这里插入图片描述
制造故障:

 mysql> drop database kk;
Query OK, 1 row affected (0.01 sec)
直接恢复
mysql> source /opt/kk.sql
ERROR 1046 (3D000): No database selected   #报错,没有数据库可选

如上所述,恢复时需要创建原先的数据库,才可以恢复

单库恢复:

mysql> create database kk;
Query OK, 1 row affected (0.00 sec)

mysql> use kk;
Database changed

方法一、在数据库内用source语句进行数据恢复
mysql> source /opt/kk.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
........省略

mysql> show databases;         #查看kk库是否恢复
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jj                 |
| kk                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> show tables;            #查看kk库中的表是否恢复
+--------------+
| Tables_in_kk |
+--------------+
| a            |
+--------------+
1 row in set (0.00 sec)

方法二、用Linux命令mysql进行数据恢复

mysql> drop table a;  //把表删了
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
Empty set (0.00 sec)

mysql> exit;
Bye
[root@server1 opt]# mysql -uroot -p kk < /opt/kk.sql  //反向导入恢复
Enter password: 

[root@server1 opt]# mysql -uroot -p -e 'show tables from kk'  //查看
Enter password: 
+------------------+
| Tables_in_school |
+------------------+
| a             |
+------------------+

5.2 多库进行完全备份

格式:

  • mysqldump -u 用户名 -p 【密码】【选项】 --databases 库名1 【库名2】… > /备份路径/备份文件名

多库备份示例:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jj                 |
| kk                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

[root@server1 ~]# mysqldump -u root -pfa123 --databases kk jj > /opt/kk.jj
[root@server1 ~]# cd /opt/
[root@server1 opt]# ll
总用量 8
-rw-r--r--. 1 root root 2051 1227 05:57 kk.jj
-rw-r--r--. 1 root root 1789 1227 05:30 kk.sql
drwxr-xr-x. 2 root root    6 326 2015 rh

多库备份好后,进入文件内查看,可以看到,在多库备份的时候,备份了创建数据库的语句,所以恢复的时候可以直接恢复

在这里插入图片描述

5.3 对所有库进行完全备份

格式:

  • musqldump -u 用户名 -p 【密码】【选项】 -add-databases > /备份路径/备份文件名

备份所有库示例:

[root@localhost ]# mysqldump -uroot -pfa123 --all-databases > /opt/all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

三、MySQL增量备份与恢复

1. MySQL增量备份-1

使用mysqldump命令进行完全备份存在的问题

  • 备份数据中有重复数据
  • 备份时间与恢复时间过长

是自上一次备份后增加/变化的文件或者内容
特点:

  • 没有重复数据,备份量不大,时间短
  • 恢复需要上次完全备份及完全备份之后所有的- 增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

2.Mysql增量备份-2

MySQL没有提供直接的增量备份方法
可以通过 MySQL提供的二进制日志间接实现增量备份
MySQL二进制日志对备份的意义

  • 二进制日志保存了所有更新或者可能更新数据库的操作
  • 二进制日志在启动MySQL服务器后开始记录,并在文件达到
    max_binlog_size所设置的大小或者接收到flush logs命令后重新
    创建新的日志文件
  • 只需定时执行flush logs方法重新创建新的日志,生成二进制文
    件序列,并及时把这些日志保存到安全的地方就完成了一个时间
    段的增量备份

3.MySQL数据库增量恢复-1

一般恢复

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

基于位置恢复

  • 数据库在某一时间点可能既有错误的操作也有正确的操作
  • 可以基于精准的位置跳过错误的操作

基于时间点恢复

  • 跳过某个发生错误的时间点实现数据恢复

4.MySQL数据库增量恢复-2

增量恢复的方法:

一般恢复

  • 格式:mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u 用户名 -p

基于位置的恢复

  • 恢复数据到指定位置
  • 格式:mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

从指定的位置开始恢复数据

  • 格式: mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码

5.MySQL数据库增量恢复-3

增量恢复的方法:

基于时间点的恢复

  • 从日志开头截止到某个时间点的恢复

  • 格式:
    mysqlbinlog [–no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

从某个时间点到日志结尾的恢复

  • 格式:mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

从某个时间点到某个时间点的恢复

  • 格式:mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日小时:分钟:秒’ 二进制日志 | mysql -u 用户名 -p 密码

6.增量备份案例

1.基于时间点恢复

还原时间点的步骤:

  • 删除原先坏掉的那张表
  • 还原完全备份的那个数据库
  • 停止在错误的时间点
  • 开始在正确的时间点

配置流程

1.开启二进制日志文件

[root@server1 ~]# vi /etc/my.cnf

在这里插入图片描述
2.重启数据库刷新,查看生成的日志文件

[root@server1 ~]# systemctl restart mysqld
[root@server1 ~]# cd /usr/local/mysql/data/
[root@server1 data]# ll

在这里插入图片描述
接下来关于所有的数据库操作,都被记录在000001文件里。

3.查看日志内容

[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000001 
--no-defaults:解决utf-8报错
--base64-output=decode-rows:解决乱码问题
-v:输出文件指向
无新操作,无新增的信息

4.创建数据库数据

[root@server1 ~]# mysql -uroot -pabc123  登录数据库
mysql> show databases;    查看数据库信息
mysql> use client;         
mysql> create table k(id int(10),name varchar(128),hobby int(10),score int(20));     
mysql> insert into k values('1','zhangsan','1','80');
mysql> insert into k values('2','lisi','6','60');
mysql> insert into k values('3','wangwu','4','50');
mysql> insert into k values('4','xiaohu','2','70');
mysql> insert into k values('5','xiao','2','90');

mysql> select * from k;
+----+----------+-------+-------+
| id | name     | hobby | score |
+----+----------+-------+-------+
|  1 | zhangsan |     1 |    80 |
|  2 | lisi     |     6 |    60 |
|  3 | wangwu   |     4 |    50 |
|  4 | xiaohu   |     2 |    70 |
|  5 | xiao     |     2 |    90 |
+----+----------+-------+-------+
5 rows in set (0.00 sec)

mysql> exit 退出

5.完全备份

[root@server1 ~]# mysqldump -uroot -pfa123 k > /opt/client-k.sql
[root@server1 ~]# cd /opt/
[root@server1 opt]# ll
总用量 4
-rw-r--r--. 1 root root 775 1227 10:57 client-k.sql
drwxr-xr-x. 2 root root   6 326 2015 rh
[root@server1 opt]# mysqladmin -uroot -p flush-logs
[root@server1 opt]# cd /usr/local/mysql/data/
[root@server1 data]# ll

在这里插入图片描述
6.数据配置

[root@server1 ~]# mysql -u root -pfa123
mysql> use client;
mysql> insert into k values(1,'fa',2,88);
Query OK, 1 row affected (0.00 sec)

mysql> insert into k values(2,'nb',3,68);
Query OK, 1 row affected (0.00 sec)

mysql> delete from k where name='zhangsan';   #误删数据
Query OK, 1 row affected (0.01 sec)
mysql> select * from k;
+----+--------+-------+-------+
| id | name   | hobby | score |
+----+--------+-------+-------+
|  3 | wangwu |     4 |    50 |
|  4 | xiaohu |     2 |    70 |
|  5 | xiao   |     2 |    90 |
|  1 | fa     |     2 |    88 |
|  2 | nb     |     3 |    68 |
+----+--------+-------+-------+
5 rows in set (0.00 sec)

7.查看生成的日志文件

[root@server1 ~]# mysqladmin -uroot -p flush-logs
[root@server1 ~]# cd /usr/local/mysql/data/
[root@server1 data]# ll

在这里插入图片描述
[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002

查找到错误时间点停止
在这里插入图片描述
在下一个正确时间点开始
在这里插入图片描述
9.模拟数据损坏恢复

[root@server1 ~]# mysql -uroot -pfa123   #登录数据库
mysql> show databases;      
mysql> drop database client;  
mysql> show databases;  
mysql> create database client; 
mysql> show databases;    
mysql> use client;         
mysql> source /opt/client-k.sql    #还原完全备份的那个数据库
mysql> select * from k;  
mysql> exit 

mysql> select * from k;
+----+--------+-------+-------+
| id | name   | hobby | score |
+----+--------+-------+-------+
|  3 | wangwu |     4 |    50 |
|  4 | xiaohu |     2 |    70 |
|  5 | xiao   |     2 |    90 |
|  1 | fa     |     2 |    88 |
|  2 | nb     |     3 |    68 |
+----+--------+-------+-------+
5 rows in set (0.00 sec)

2.基于位置点恢复

2.1步骤

  • 位置点恢复
  • 删除原先坏掉的那张表
  • 任意删除两个数据字段
  • 利用日志,备份恢复
  • 查询该二进制日志内容
  • 上一次正确操作的位置点停止
  • 下一次正确操作的位置点开始

2.2 配置流程

1.设置数据库数据

[root@server1 ~]# mysql -uroot -pfa123    #登录数据库
mysql> use client;
mysql>  select * from k; 
mysql>  delete from k where name='lisi';   
mysql>  delete from k where name='nb';  
[root@server1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000003   #查看日志中操作的停止与操作的开始

2.恢复数据

[root@server1 ~]# mysqlbinlog --no-defaults --stop-position='3475' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
[root@server1 ~]#  mysqlbinlog --no-defaults --start-position='3829' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
[root@server1 ~]# mysql -uroot -pfa123
mysql> use client;
mysql>  select * from k; 查询所有字段

猜你喜欢

转载自blog.csdn.net/F2001523/article/details/111829954