MsSQL数据备份与恢复---完全备份与增量备份

2023-10-28

文章目录

1.数据备份

1.1 数据备份的重要性

  • 在生产环境中,数据的安全性至关重要
  • 任何数据的丢失都可能产生严重的后果
  • 造成数据丢失的原因
    程序错误
    人为操作错误
    运算错误
    磁盘故障
    灾难(如火灾,地震)和盗窃

1.2 数据备份的分类

1.2.1 从物理与逻辑的角度分类

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

1.2.2 从数据库的备份策略角度分类

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

1.2.3 备份方式的比较

备份方式 完全备份 差异备份 增量备份
完全备份时的状态 表1、表2 表1、表2 表1、表2
第一次添加内容 创建表3 创建表3 创建表3
备份内容 表1、表2 、表3 表3 表3
第二次添加内容 创建表4 创建表4 创建表4
备份内容 表1、表2 、表3、表4 表3、表4 表4

1.3 常见的备份方法

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

  • 专用备份工具mydump或mysqlhotcopy
    mysqldump常用的逻辑备份工具
    mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

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

  • 第三方工具备份
    免费的MySQL热备份软件Percona XtraBackup

2.MySQL完全备份与恢复

2.1 完全备份概念

  • 完全备份是对整个数据库的备份、数据库结构和文件结构的备份

  • 完全备份保存的是备份完成时刻的数据库

  • 完全备份是增量备份的基础

  • 完全备份是对整个数据库的备份、数据库结构和文件结构的备份

  • 完全备份保存的是备份完成时刻的数据库

  • 完全备份是增量备份的基础

2.2 完全备份的优缺点

  • 优点:
    安全性高
    备份与恢复操作简单方便
  • 缺点:
    数据存在大量的重复
    占用大量的备份空间,空间利用率低
    备份与恢复时间长

2.3 mysqldump备份演练

2.3.1 使用tar打包文件夹备份

  • MySQL的数据库文件默认都是保存在安装目录的 data 文件夹下面(/usr/local/mysq/data/),可以直接保存 data 文件夹,但是占用空间较大,可以使用tar打包压缩进行保存。
  • 当数据库很大时,可以使用压缩比率较大的xz格式压缩,首先需要安装xz压缩格式工具
yum -y install xz
  • 物理冷备份与恢复
打包文件夹 /usr/local/mysql/data/
systemctl stop mysqld
mkdir /backup
tar zxvf /backup/mysql_all-$(date + %F).tar.gz /usr/local/mysq/data/		
##/usr/local/mysql/data备份压缩

对比打包前后的文件大小,可以看到压缩的备份文件占用空间很小
du -sh /backup/mysql-2020-12-24.tar.gz
du -sh /usr/local/mysq/data/

若数据库文件丢失,可以解压缩备份文件,相当于做了数据恢复操作
mkdir /restore
tar zxvf /backup/mysql_all-2020-12-24.tar.gz -C /restore/		##时间节点可能不一样
mv /restore/usr/local/mysql/data/ /usr/local/mysql/       ##将备份数据移动到到/usr/local/mysql中
systemctl start mysqld        ##启动mysql数据库

2.3.2 使用mysqldump工具备份

  • 使用mysqldump命令对某些表进行完全备份,命令格式为
mysqldump -u 用户名 -p [密码] [选项] [数据库名] [数据表名] > /备份路径/备份文件名

示例:
mysqldump -uroot -p123456 imployee_salary IT_salary IT_desc > /opt/salary.sql
即对库imployee_salary中的表IT_salary、IT_desc进行备份,备份文件是 /opt/salary.sql
  • 使用mysqldump对单个数据库进行完全备份,命令格式
mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名

示例:
mysqldump -uroot -p123456 imployee_salary > /opt/salary2.sql
即对库imployee_salary进行备份,备份文件是 /opt/salary2.sql
  • 使用mysqldump对多个数据库进行完全备份,命令格式
mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 库名2... > /备份路径/备份文件名

示例:
mysqldump -uroot -p123456 imployee_salary test > /opt/salary3.sql
  • 使用mysqldump对所有数据库进行完全备份,命令格式
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名

示例:
mysqldump -uroot -p123456 --all-databases > /opt/salary4.sql
  • 使用mysqldump也可以直接备份表结构,命令格式
mysqldump -u 用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名

示例:
mysqldump -uroot -p123456 -d imployee_salary IT_salary IT_desc > /opt/salary5.sql

2.4 MySQL完全备份

  • 将指定的库、表、或全部的库导出为SQL脚本
  • mysqldump备份需要和mysql进行数据交互,如果关闭 mysql 则无法备份和恢复

2.4.1 创建环境

[root@localhost ~]# mysqladmin -uroot -p password 'abc123'	'//设置登录密码'
[root@localhost ~]# mysql -uroot -pabc123
...
mysql> create database auth;                 		 '//创建auth 这个数据库'
mysql> use auth;                              		'//进入auth 这个数据库'
mysql> create table users (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', PRIMARY KEY (user_name));
Database changed
mysql> insert into users(user_name,user_passwd) values('zhangsan', password('123456'));
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into users values('lisi', password('123456'));
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

2.4.2 备份auth数据库

[root@localhost ~]# mysqldump -u root -p --databases auth > /opt/auth.sql	'//备份auth数据库'
Enter password: 		'//输入数据库的登录密码 abc123'
[root@localhost ~]# cd /opt/
[root@localhost opt]# grep -v "^--" auth.sql | grep -v "^/" | grep -v "^$"	'//查看备份文件'
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `auth` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `auth`;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `user_name` char(16) NOT NULL,
  `user_passwd` char(48) DEFAULT '',
  PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOCK TABLES `users` WRITE;
INSERT INTO `users` VALUES ('lisi','*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'),('zhangsan','*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9');
UNLOCK TABLES;

2.5 MySQL完全恢复

2.5.1 数据恢复的两种方法

  • 使用 mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入
source命令		'//需要登录到数据库'
mysql命令		'//不需要登录到数据库'
  • source命令恢复数据库或数据表的步骤
登录到 MySQL 数据库
执行 source 备份sql脚本的路径(绝对路径)

mysql > source /备份路径/备份文件名     '//使用绝对路径'

2.5.2 恢复数据库的操作

  • 恢复数据库的命令格式
mysql -u 用户名 -p[密码] 库名 < /备份路径/备份文件名  
'//当数据库被删除后,恢复时需要先创建数据库名,不然会报错'
或者
mysql -u 用户名 -p[密码] < /备份路径/备份文件名		
'//该命令不需要指定数据库,误删除后也不需要再创建数据库名'
  • 查看数据库备份文件是否存在
[root@localhost ~]# cd /opt
[root@localhost opt]# ll	'//查看数据库备份文件'
总用量 8
-rw-r--r--. 1 root root 2094 1224 16:34 auth.sql
drwxr-xr-x. 2 root root    6 326 2015 rh
-rw-r--r--. 1 root root 1957 1224 16:34 user1.sql
[root@localhost opt]#

在这里插入图片描述

  • 模拟故障删除auth数据库
[root@localhost ~]# mysql -u root -p -e 'drop database auth'		'//删除数据库auth'
Enter password: 	'//输入登录密码'
[root@localhost ~]# mysql -u root -p -e 'show databases'	'//查看数据库,发现auth数据库已被删除'
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
  • 导入数据库,并查看结果
[root@localhost ~]# mysql -u root -p < /opt/auth.sql
Enter password: 
[root@localhost ~]# mysql -u root -p -e 'show databases'

在这里插入图片描述

  • 此时表示数据库auth恢复成功

2.5.3 恢复数据表的操作

  • 恢复表的命令格式
mysql -u 用户名 -p[密码] 库名 < /备份路径/备份文件名
  • 首先对表users进行备份
[root@localhost ~]# mysqldump -uroot -pabc123 auth users > /opt/user1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# cd /opt/
[root@localhost opt]# ll
总用量 8
-rw-r--r--. 1 root root 2094 1224 16:06 auth.sql
drwxr-xr-x. 2 root root    6 326 2015 rh
-rw-r--r--. 1 root root 1957 1224 16:19 user1.sql
  • 当数据损坏,删除数据库auth中的users表
[root@localhost ~]# mysql -uroot -pabc123
...
mysql> use auth;		//使用auth数据库
Database changed
mysql> show tables;		//查看auth库中包含的表
+----------------+
| Tables_in_auth |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users;		//查看表里的内容
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> drop table users;		//删除users表
Query OK, 0 rows affected (0.00 sec)

mysql> select * from users;
ERROR 1146 (42S02): Table 'auth.users' doesn't exist

在这里插入图片描述

  • 不登陆MySQL,使用mysql命令恢复表
[root@localhost ~]# mysql -uroot -pabc123 auth < /opt/user1.sql
[root@localhost ~]# mysql -uroot -pabc123
...
mysql> use auth;
Database changed
mysql> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

在这里插入图片描述

  • 此时表示数据表恢复成功

3.MySQL数据库增量备份与恢复

3.1 增量备份的概念

3.1.1 为什么使用增量备份

  • 完全备份存在的问题很容易看到,每次都是把所有的数据内容进行备份,备份数据中有大量的重复数据,并且完全备份的时间与恢复的时间很长。
  • 解决完全备份存在的问题就是使用增量备份的方式,增量备份就是备份自上一次备份之后增加或改变的文件或者内容。

3.1.2 增量备份的特点

  • 与完全备份完全不同,增量备份没有重复数据,备份量不大,时间短;
  • 但其恢复麻烦,需要上次完成完全备份及备份之后的所有增量备份才能恢复。

3.1.3 MySQL数据库二进制日志对备份的意义

  • 由于MySQL没有提供直接增量备份的方法,但是可以通过MySQL的二进制日志间接实现增量备份。
  • 二进制日志对备份的意义:
1.二进制日志保存了所有更新或者可能更新数据的操作。
2.二进制日志在启动mysql服务器后开始记录,并在文件达到二进制日志所设置的最大值或者接受到flush logs命令后重新创建新的日志文件
3.只需要定时执行 flush logs 方法重新创建新的日志文件,生成二进制的文件序列,并及时把这些日志文件保存到安全的存储位置,即可完成一个时间段的增量备份

3.2 MySQL实现增量备份

3.2.1 配置开启日志功能

[root@localhost ~]# vi /etc/my.cnf
[client]
port = 3306
default-character-set = utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set = utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server = utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=/usr/local/mysql/data/mysql-bin		//添加该配置,开启二进制日志功能
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

3.2.2 重启mysql数据库,并查看生成日志

[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# ll /usr/local/mysql/data/
总用量 122924
drwxr-x---. 2 mysql mysql       54 1224 17:17 auth
-rw-r-----. 1 mysql mysql       56 1223 01:08 auto.cnf
-rw-r-----. 1 mysql mysql      414 1224 17:46 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 1224 17:46 ibdata1
-rw-r-----. 1 mysql mysql 50331648 1224 17:46 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 1223 01:08 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 1224 17:46 ibtmp1
drwxr-x---. 2 mysql mysql     4096 1223 01:08 mysql
-rw-r-----. 1 mysql mysql      154 1224 17:46 mysql-bin.000001		//日志文件已生成
-rw-r-----. 1 mysql mysql       39 1224 17:46 mysql-bin.index
drwxr-x---. 2 mysql mysql     8192 1223 01:08 performance_schema
drwxr-x---. 2 mysql mysql     8192 1223 01:08 sys

3.2.3 创建备份文件保存文件夹

[root@localhost ~]# mkdir /opt/bak_sql

3.2.4 使用mysqldump命令对数据库或表备份

  • 一般选择负载较轻的时间段,或者用户访问较少的时间段进行备份。
使用mysqldump 备份auth库的users表

[root@localhost ~]# mysqldump -u root -p auth users >/opt/bak_sql/auth_users-$(date +%F).sql		
											//注意括号中%F 的F必须是大写的
[root@localhost ~]# ll /opt/bak_sql
总用量 4
-rw-r--r--. 1 root root 1961 1224 19:57 auth_users-2020-12-24.sql
使用mysqldump 备份auth库的users表

[root@localhost ~]# mysqldump -u root -p --databases auth > /opt/bak_sql/auth-$(date +%F).sql
[root@localhost ~]# ll /opt/bak_sql
总用量 8
-rw-r--r--. 1 root root 2098 1224 19:58 auth-2020-12-24.sql
-rw-r--r--. 1 root root 1961 1224 19:57 auth_users-2020-12-24.sql		

3.2.5 进行增量备份操作

  • 使用mysqladmin的选项 flush-logs 生成新的二进制文件,这样在插入新的数据后,新的二进制文件对应的就是数据库变化的内容
[root@localhost ~]# ll /usr/local/mysql/data/
...
-rw-r-----. 1 mysql mysql      154 1224 17:46 mysql-bin.000001
[root@localhost ~]# mysqladmin -uroot -pabc123 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ll /usr/local/mysql/data/
...
-rw-r-----. 1 mysql mysql      201 1224 20:04 mysql-bin.000001
-rw-r-----. 1 mysql mysql      154 1224 20:04 mysql-bin.000002		//新生成的二进制文件	

在这里插入图片描述

  • 生成之前mysql-bin 文件的编号最大为1,生成后最大编号是2,之后的数据库操作会保存到编号2的二进制文件中

3.2.6 插入新的数据

  • 目的:模拟数据的增加或者更改
mysql> insert into users values('chenmou', password('123456'));

mysql> insert into users values('yangguo', password('123456'));

mysql> insert into users values('ningque', password('123456'));

mysql> insert into users values('yeyou', password('123456'));

在这里插入图片描述

3.2.7 执行 flush logs 生成新的二进制文件

[root@localhost ~]# mysqladmin -uroot -pabc123 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ll /usr/local/mysql/data/
...
-rw-r-----. 1 mysql mysql      201 1224 20:04 mysql-bin.000001
-rw-r-----. 1 mysql mysql     1427 1225 00:01 mysql-bin.000002		//保存本次操作的数据
-rw-r-----. 1 mysql mysql      154 1225 00:01 mysql-bin.000003		//新生成的日志文件

在这里插入图片描述

  • 查看二进制文件的内容为
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
		//使用64位解码器查看日志

3.2.8 完成增量备份

  • 把二进制文件复制到保存备份的目录
[root@localhost data]# cp mysql-bin.000002 /opt/bak_sql/
[root@localhost data]# ls /opt/bak_sql/
auth-2020-12-24.sql  auth_users-2020-12-24.sql  mysql-bin.000003

3.2.9 增量备份原理总结

  • 首先是每周使用mysqldump完全备份数据库,在整库备份的时间点之后,每天使用 flush logs 生成新的二进制文件,二进制文件保存的是每天对数据库的操作变化的内容,内容是不重复的。
  • 所以每周的备份整库加上每天二进制备份文件,相当于是数据库限制的数据状态。

3.3 MySQL增量恢复的方法

  • 一般恢复
  • 断点恢复
    基于时间点的恢复
    基于位置的恢复

3.3.1 一般恢复

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

3.3.2 基于时间点的恢复

  • 从日志开头截止到某个时间点的恢复
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 密码

3.3.3 基于位置的恢复

  • 恢复数据到指定位置
mysqlbinlog --stop-position='操作id' 二进制日志 | mysql -u 用户名 -p 密码
  • 从指定的位置开始恢复数据
mysqlbinlog --start-position='操作id' 二进制日志 | mysql -u 用户名 -p 密码

3.3.4 增量恢复的步骤

  • 开启二进制日志
  • 添加数据
  • 进行完全备份
  • 录入新的数据
  • 进行增量备份(刷新二进制日志)
  • 模拟故障
  • 恢复操作

3.4 增量恢复操作

3.4.1 一般恢复

  • 遵循原则:丢失什么数据,就找回什么数据。

(1)查看数据库与表的内容

[root@localhost ~]# mysql -uroot -pabc123
...
mysql> use auth;
Database changed
mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| chenmou   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ningque   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yangguo   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yeyou     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
6 rows in set (0.00 sec)

(2)由于我们在之前已经进行了完全备份与增量备份,所以我们可以直接进行模拟误操作:删除 users 表

[root@localhost ~]# mysql -u root -p -e 'drop table auth.users'
Enter password: 
[root@localhost ~]# mysql -u root -p -e 'select * from auth.users'
Enter password: 
ERROR 1146 (42S02) at line 1: Table 'auth.users' doesn't exist

(3)恢复操作

先恢复完全备份

[root@localhost ~]# mysql -u root -p auth < /opt/bak_sql/auth_users-2020-12-24.sql
Enter password: 
[root@localhost ~]# mysql -u root -p -e 'select * from auth.users'
Enter password: 
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+

在这里插入图片描述

再恢复增量备份

[root@localhost ~]# mysqlbinlog --no-defaults /opt/bak_sql/mysql-bin.000002 | mysql -u root -p
Enter password: 
[root@localhost ~]# mysql -u root -p -e'select * from auth.users'
Enter password: 
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| chenmou   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ningque   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yangguo   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yeyou     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+

3.4.2 基于时间点和基于位置的恢复

  • 利用二进制可实现基于时间点和基于位置的恢复
[root@localhost ~]# mysqladmin -uroot -pabc123 flush-logs		//先进行二进制文件分割
[root@localhost ~]# ll /usr/local/mysql/data/
...
-rw-r-----. 1 mysql mysql      154 1225 01:27 mysql-bin.000005		//新生成的二进制编号为5
[root@localhost ~]# mysql -uroot -pabc123
...
mysql> use auth;
mysql> insert into users values('shunce', password('123456'));
mysql> delete from users where user_name='yeyou';		//误操作删除了该表中的数据
mysql> insert into users values('xunyu', password('123456'));
mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| chenmou   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ningque   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| shunce    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| xunyu     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yangguo   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
7 rows in set (0.00 sec)
  • 由于编号为5的二进制文件中既保存了正确的插入语句,也保存了不应该执行的删除语句,可以查看日志得到详细的信息
查看日志得
[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000005
...
BEGIN
/*!*/;
# at 291
#201225  1:33:47 server id 1  end_log_pos 344 CRC32 0xa03426c5 	Table_map: `auth`.`users` mapped to number 222
# at 344
#201225  1:33:47 server id 1  end_log_pos 429 CRC32 0x3b0b632c 	Write_rows: table id 222 flags: STMT_END_F
### INSERT INTO `auth`.`users`
### SET
###   @1='shunce'
###   @2='*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
# at 429
#201225  1:33:47 server id 1  end_log_pos 460 CRC32 0x3960a0dc 	Xid = 112
COMMIT/*!*/;
# at 460
#201225  1:36:34 server id 1  end_log_pos 525 CRC32 0x34a56ff0 	Anonymous_GTID	last_committed=1	sequence_number=2rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 525
#201225  1:36:34 server id 1  end_log_pos 597 CRC32 0x9da7f4e2 	Query	thread_id=18	exec_time=0	error_code=0
SET TIMESTAMP=1608831394/*!*/;
BEGIN
/*!*/;
# at 597
#201225  1:36:34 server id 1  end_log_pos 650 CRC32 0xebc35266 	Table_map: `auth`.`users` mapped to number 222
# at 650
#201225  1:36:34 server id 1  end_log_pos 734 CRC32 0xbc048847 	Delete_rows: table id 222 flags: STMT_END_F
### DELETE FROM `auth`.`users`
### WHERE
###   @1='yeyou'
###   @2='*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
# at 734
#201225  1:36:34 server id 1  end_log_pos 765 CRC32 0x479205b1 	Xid = 114
COMMIT/*!*/;
# at 765
#201225  1:37:09 server id 1  end_log_pos 830 CRC32 0xf2faf11d 	Anonymous_GTID	last_committed=2	sequence_number=3rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 830
#201225  1:37:09 server id 1  end_log_pos 902 CRC32 0x88940503 	Query	thread_id=18	exec_time=0	error_code=0
SET TIMESTAMP=1608831429/*!*/;
BEGIN
/*!*/;
# at 902
#201225  1:37:09 server id 1  end_log_pos 955 CRC32 0xb69735e9 	Table_map: `auth`.`users` mapped to number 222
# at 955
#201225  1:37:09 server id 1  end_log_pos 1039 CRC32 0xf1e87994 	Write_rows: table id 222 flags: STMT_END_F
### INSERT INTO `auth`.`users`
### SET
###   @1='xunyu'
###   @2='*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
# at 1039
#201225  1:37:09 server id 1  end_log_pos 1070 CRC32 0x3f5b606f 	Xid = 115
COMMIT/*!*/;
...
[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000005 > /opt/bak.txt
	//也可以将日志文件导成txt文本,方便查看
[root@localhost ~]# vi /opt/bak.txt
  • 基于时间点的恢复操作
[root@localhost ~]# mysqlbinlog --no-defaults --stop-datetime='2020-12-25 1:36:34' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -pabc123
[root@localhost ~]# mysqlbinlog --no-defaults --start-datetime='2020-12-25 1:37:09' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -pabc123
[root@localhost ~]# mysql -u root -p -e 'select * from auth.users'
Enter password: 
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| chenmou   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ningque   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yangguo   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yeyou     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| shunce    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| xunyu     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
  • 基于位置的恢复操作
[root@localhost ~]# mysqlbinlog --no-defaults --stop-position='650' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -pabc123
[root@localhost ~]# mysqlbinlog --no-defaults --start-position='955' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -pabc123
[root@localhost ~]# mysql -u root -p -e 'select * from auth.users'
Enter password: 
+-----------+-------------------------------------------+
| user_name | user_passwd                               |
+-----------+-------------------------------------------+
| chenmou   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| lisi      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ningque   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yangguo   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| yeyou     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| shunce    | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| xunyu     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+

4.总结

(1)MySQL中使用mysqldump工具备份,它生成的是SQL脚本文件

  • 从物理和逻辑的角度,备份可分为物理备份和逻辑备份;
  • 从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份;
  • 恢复数据使用mysql、source命令;
  • 备份可以针对整库、某些库或某些表进行。

(2)MySQL没有提供增量备份的工具,需要借助二进制日志文件进行操作

  • 使用分割日志的方式为增量备份;
  • 增量备份恢复需要根据日志文件的时间先后逐个执行;
  • 使用基于时间和位置的方式进行恢复,可以更精确地恢复数据;
  • 大型企业每周做一次全备,每天做一次增量备份。中小企业应每天做一次全备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MsSQL数据备份与恢复---完全备份与增量备份 的相关文章

  • 如何解决 MySQL Workbench 上的这些行错误?

    正如您所看到的 我的代码中没有语法错误或类似的错误 你们能帮我吗 我想这只是错误标记机制中的一个小错误 尝试编辑代码或关闭此编辑器并打开一个新编辑器 如果您有重现此问题的步骤列表 您甚至可以创建一个错误报告 http bugs mysql
  • 在数据库中存储差异的最紧凑方式是什么?

    我想实现类似于维基媒体的修订历史的东西 最好使用的 PHP 函数 库 扩展 算法是什么 我希望差异尽可能紧凑 但我很高兴只能显示每个修订版与其同级修订版之间的差异 并且一次只能回滚一个修订版 在某些情况下 只有几个字符可能会发生变化 而在其
  • sqlalchemy 中的随机 ID(pylon)

    我正在使用 pylons 和 sqlalchemy 我想知道如何将一些随机 id 作为primary key 最好的方法是使用随机生成的 UUID import uuid id uuid uuid4 uuid 数据类型在某些数据库中本机可用
  • 将 php filter_var 与 mysql_real_escape_string 结合使用

    我想首先说 我意识到 PDO mysqli 是新标准 并且已被 SO 广泛覆盖 然而 在这种特殊情况下 我没有时间在启动客户端站点之前将所有查询转换为 PDO 以下内容已在网站上的大多数查询中使用 我可以补充一下 这不是我所使用的 user
  • 如何在 Node.js 中使用 Winston 将日志存储到 mysql 数据库

    我正在使用 winston 为我的应用程序进行日志记录 我已经使用这个完成了文件传输 class LoggerHelper extends BaseHelper constructor cApp super cApp this props
  • 找时间通过 PHP 执行 MySQL 查询

    我在互联网上看到过这个问题 here http www phpbuilder com board showthread php t 2100256 and here http answers yahoo com question index
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • 使用 PHP 将文件上传到 MySql DB

    我希望用户通过我在后端使用 MySql 用 PHP 开发的 web 应用程序上传文件 我想将文件存储在数据库中 我在这样做时遇到了问题 此外 一旦文件存储在数据库中 我们如何下载它 并在 web 应用程序中正确显示它 文件类型和文件的其他属
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • pyodbc 无法正确处理 unicode 数据

    我确实使用 pyodbc 成功连接了 MySQL 数据库 并且它可以很好地处理 ascii 编码的数据 但是当我打印使用 unicode utf8 编码的数据时 它引发了错误 UnicodeEncodeError ascii codec c
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • Python 子进程、mysqldump 和管道

    我在尝试构建简单的备份 升级数据库脚本时遇到问题 错误出现在使用子进程的 mysqldump 调用中 cmdL mysqldump user db user password db pass domaindb gzip gt databas
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 0比20,字节跳动在与腾讯的这场掐架中输的太惨...

    5月7日 中国新闻网报道称 广州知识产权法院于4月26日作出了一项诉讼判决 认定字节跳动旗下火山小视频 现抖音火山版 平台玩家 在未经腾讯授权的情况下直播 王者荣耀 游戏 构成侵权 一审判决要求火山小视频停止 王者荣耀 游戏直播 并赔偿原告
  • 106. 从中序与后序遍历序列构造二叉树

    一 题目描述 给定两个整数数组 inorder 和 postorder 其中 inorder 是二叉树的中序遍历 postorder 是同一棵树的后序遍历 请你构造并返回这颗 二叉树 示例 1 输入 inorder 9 3 15 20 7
  • 爬虫从入门到放弃——Webmagic源码阅读之PageModel

    PageModel 在OOSpider里面 有这样一段注释 The spider for page model extractor br In webmagic we call a POJO containing extract resul
  • 实现和设置玩家UI血量等基本操作。(Unity)

    方法一 在屏幕上显示玩家的UI血量 首先在UI组件中创建Canvas画布 设置画板大小 具体数字按自己要求来 创建玩家的血条UI 选择Slider组件 调整下面箭头处 具体值按你自己的要求来 在填充处选择玩家血量的填充颜色 因为开发中我们需
  • 利用pygame写星球大战小游戏

    前段时间学了pygame 这两天写一个星球大战小游戏 今天准备分享出来 开发工具 python3 8 pycharm 代码注释超级详细 在这里就废话不多说了 请看代码 导入相关模块及库 import pygame import sys im
  • 6. 从0开始学ARM-异常及中断处理、异常向量表、swi

    七 异常及中断处理 异常向量表 swi 一 异常 Exception 异常是理解CPU运转最重要的一个知识点 几乎每种处理器都支持特定异常处理 中断是异常中的一种 有时候我们衡量一个操作系统的时候实时性就是看os最短响应中断时间以及单位时间
  • 第17课 微信小程序通过node获取用户openid:

    第17课 微信小程序通过node获取用户openid 调用 wx login 获取 临时登录凭证code 并回传到开发者服务器 调用 auth code2Session 接口 换取用户唯一标识 OpenID 和 会话密钥 session k
  • 11款常用的安全测试工具

    1 AppScan 一款安全漏洞扫描工具 支持Web和移动 现在安全测试做漏洞扫描非常适用 它相当于是 探索 和 测试 的过程 最终生成很直观的测试报告 有助于研发人员分析和修复通常安全测试工具用这个 扫描一些安全漏洞 用起来比较方便 网上
  • php request instance,TP5学习笔记 请求(request)变量

    可以通过Request对象完成全局输入变量的检测 获取和安全过滤 支持包括 GET POST REQUEST SERVER SESSION COOKIE ENV等系统变量 以及文件上传信息 检测变量是否设置 可以使用has方法来检测一个变量
  • linux 挂载磁盘 普通用户读写 --chatGPT

    问 mount 挂载共享磁盘 指定用户fly可以读写 gpt 要将共享磁盘挂载并授予用户 fly 读写权限 您可以使用 mount 命令结合合适的挂载选项 首先 您需要确保磁盘已经连接到系统上 然后 按照以下步骤进行操作 1 创建一个目标目
  • CPU 与 GPU 之间数据转换 cudaMemcpy

    显存上分配空间 CUDA SAFE CALL cudaMalloc void Dst d sizeof float3 totalPNum 显存上传输数据 CUDA SAFE CALL cudaMemcpy Dst d Srcdata0 h
  • HAProxy--理论--02--配置文件

    HAProxy 理论 02 配置文件 1 配置文件组成 1 global 设置全局配置参数 2 defaults 设置的默认参数 3 frontend 接收请求的前端虚拟节点 Frontend可以直接指定具体使用后端的backend 4 b
  • anaconda 激活环境 并 安装相关包 torch 安装matplotlib

    1 管理员身份 运行 anaconda prompt 2 激活环境 查看python版本 activate 环境名称 3 查看已经安装的包 4 安装所需的包 方法1 pip install matplotlib 如果太慢建议更换国内镜像源
  • vue中给dom元素绑定js原生onclick事件并获取data中定义的数据和调用函数

    onclick 执行的是 window 环境中的方法 所以 将 this 中的方法或data中定义的字段关联到 window 上即可 vue代码 mounted window customMethods this customMethods
  • MariaDB+SpringBoot 报错 Caused by: java.sql.SQLException: GSS-API authentication exception

    最近在搭建springboot mybatis mariadb 项目的时候遇到了如题的问题 搜索了一圈没找到合适的解决方法 因此记录下我的解决方案 希望对后来者有帮助 先说结论 重装MariaDB即可 1 环境和配置信息 开发环境 win1
  • 排序基础算法(一)—— 堆排序

    堆排序 前言 1 完全二叉树 2 大根堆和小根堆 3 堆排序原理 一 调整堆 二 建初堆 三 堆排序算法的实现 Java代码 前言 堆排序是一种树形选择排序 在排序过程中 将待排序的记录r 1 n 看成是一棵完全二叉树的顺序存储结构 利用完
  • ffmpeg基础(五) I帧B帧P帧

    一 I帧 关键帧 属于帧内压缩 你可以理解为这一画面的完整保留 解码的时候只需要本帧的数据就可以完成 因为它包含的是完整信息 特点 1 它是一个全帧压缩编码帧 将全帧图像进行JPEG压缩以及传输 2 解码的时候只需要通过I帧的数据就可以得到
  • C++primer Plus 第三章复习题

    1 为什么C 有多种整型 有多种整型 可以根据输出结果选择最合适的类型 比如年龄可以使用short 存储容量用long 2 声明与下述描述相符的变量 a short整型 值为80 short num 80 b unsigned int 整型
  • python时间相减_python 计算时间差,时间加减运算代码

    1 方便的计算两个时间的差 如两个时间相差几天 几小时 import datetime d1 datetime datetime 2009 3 23 d2 datetime datetime 2009 10 7 dayCount d1 d2
  • MsSQL数据备份与恢复---完全备份与增量备份

    文章目录 1 数据备份 1 1 数据备份的重要性 1 2 数据备份的分类 1 2 1 从物理与逻辑的角度分类 1 2 2 从数据库的备份策略角度分类 1 2 3 备份方式的比较 1 3 常见的备份方法 2 MySQL完全备份与恢复 2 1