当前位置: 首页 > news >正文

Linux——数据库备份与恢复

一,Mysql数据库备份概述

1,数据库备份的重要性

  • 数据灾难恢复:数据库可能会因为各种原因出现故障,如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份,就可以在发生灾难后将数据库恢复到最近的一个正常状态,最大限度地减少数据丢失和业务中断的影响。
  • 误操作恢复:人为的误操作是很常见的,例如误删除数据、错误的更新操作等。备份可以作为一种 “后悔药”,方便及时将数据库恢复到误操作之前的状态,避免因误操作而造成的严重后果。
  • 数据迁移与共享:在进行数据库迁移到新的服务器或系统时,备份可以方便地将数据从旧环境迁移到新环境。此外,备份也可以用于在不同的系统或团队之间共享数据,确保数据的一致性和完整性。
  • 历史数据存档:随着时间的推移,数据库中的数据会不断增加,一些历史数据可能不再经常被访问,但仍然需要保留以备查询和分析。通过备份,可以将这些历史数据存档,减轻生产数据库的存储压力,同时也便于在需要时快速恢复和查询历史数据。

2,数据库备份类型

1,按备份内容分类

  • 完全备份:对整个数据库进行完整的备份,包括所有的数据、表结构、索引、存储过程等数据库对象。这种备份方式的优点是恢复时简单快捷,只需将备份文件恢复到数据库中即可,可一次性将数据库恢复到备份时的状态。缺点是备份时间长,占用存储空间大。
  • 差异备份:备份自上次完全备份以来发生变化的数据。恢复时,只需先恢复完全备份,再恢复最新的差异备份,恢复过程相对简单。与增量备份相比,差异备份不依赖于上一次差异备份的结果,
  • 增量备份:只备份自上次备份(可以是完全备份或增量备份)以来发生变化的数据。其优点是备份速度快,占用存储空间小,可以更频繁地进行备份,从而减少数据丢失的风险。

2,按备份数据库的状态分类

  • 热备份:也称为在线备份,在数据库正常运行、用户可以正常访问和操作数据库的情况下进行备份。热备份不会影响数据库的正常使用,但实现起来相对复杂,需要数据库管理系统提供相应的支持。
  • 温备份:在数据库运行状态下进行备份,但备份过程中会限制部分数据库操作,如暂停一些非关键的写入操作,以确保备份数据的一致性。
  • 冷备份:也称为离线备份,在数据库停止运行的状态下进行备份。这种方式简单直接,能保证备份数据的一致性,因为在备份过程中没有数据的写入和修改。但冷备份期间数据库无法使用,会导致业务中断,

3,按备份数据库的存储位置分类

  • 本地备份:将备份数据存储在与数据库服务器相同的本地存储设备上,如本地硬盘、磁盘阵列等。本地备份的优点是备份和恢复速度快,因为数据传输距离短。缺点是如果本地存储设备出现故障,
  • 异地备份:将备份数据存储在远离数据库服务器的其他地方,如通过网络将备份数据传输到远程的数据中心、云存储或其他服务器上。异地备份可以有效防止本地灾难(如火灾、洪水、地震等)对备份数据的破坏,提高数据的安全性和可靠性。

3,常见的备份方法

  • 物理冷备份:

物理冷备份时需要在数据库处于关闭状态下,能够较好地保证数据库的完整性。物理冷备份一般用于非核心业务,这类业务一般都允许中断,物理冷备份的特点就是速度快,恢复时也是最为简单的。通常通过直接打包数据库文件夹(本章中的数据库文件夹位于/usr/local/mysql/data)来实现备份。

  • 使用第三方工具mysqldump工具

mysqldump 是客户端常用逻辑备份程序,能够产生一组被执行以后再现原始数据库对象定义和表数据的SQL 语句。它可以转储一个到多个 MySQL 数据库,对其进行备份或传输到远程SQL 服务器。mysqldump 更为通用,因为它可以备份各种表。

  • 使用mysqlhotcopy工具:

mysqlhotcopy是一个 Perl 脚本,主要用于对 MyISAM 表进行快速备份。它通过复制表文件的方式来实现备份,在备份时会对表进行锁定,以确保数据的一致性。语法:mysqlhotcopy [选项] 数据库名 [备份目录]。如果不指定备份目录,则默认将备份文件存储在当前目录下。

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

MySQL 支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户 提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。

  • 通过第三方工具备份(如 Percona XtraBackup):

这是一款开源的、高性能的 MySQL 数据库备份工具,主要用于 InnoDB 和 XtraDB 存储引擎的热备份。它通过复制数据文件和日志文件,并在备份过程中应用事务日志,来确保备份数据的一致性。

二,数据库备份操作

1,物理备份与操作

  • 使用完全备份来备份数据
mysql> create database db1;             ##创建数据库
Query OK, 1 row affected (0.01 sec)mysql> use db1;
Database changed
mysql> create table t1(user_name char(20),user_pass char(40));      ##创建表
Query OK, 0 rows affected (0.02 sec) mysql> insert into t1 values('zhangsan','123456');     ##准备要备份的数据
Query OK, 1 row affected (0.03 sec)mysql> insert into t1 values('lisi','123456');
Query OK, 1 row affected (0.01 sec)mysql> select * from t1;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123456    |
| lisi      | 123456    |
+-----------+-----------+
2 rows in set (0.00 sec)

  • 创建用于存放备份数据的目录
[root@bogon ~]# systemctl stop mysqld    ##因为做的是冷备份所以说需要关闭mysql数据库[root@bogon ~]# mkdir -p /opt/backup     ##创建目录用于存放备份的文件[root@bogon ~]# cd /usr/local/mysql/
[root@bogon mysql]# ls
bin  data  docs  include  lib  LICENSE  man  README  share  support-files
[root@bogon mysql]# tar zcvf back.tar.gz data   ##将数据库文件data压缩为back.tar.gz[root@bogon mysql]# mv back.tar.gz /opt/backup       ##移动到backup目录中
[root@bogon mysql]# ls !$ 
ls /opt/backup
back.tar.gz
  • 验证,模拟数据库故障

[root@bogon data]# cd /usr/local/mysql/data          
[root@bogon data]# lsauto.cnf        ca.pem               ibtmp1                      performance_schemabinlog.000001   client-cert.pem     '#innodb_redo'               private_key.pembinlog.000002   client-key.pem      '#innodb_temp'               public_key.pembinlog.000003   error.log            localhost.localdomain.pid   server-cert.pembinlog.000004  '#ib_16384_0.dblwr'   mysql                       server-key.pembinlog.index   '#ib_16384_1.dblwr'   mysql.ibd                   sysbogon.pid       ib_buffer_pool       mysql.sock                  undo_001ca-key.pem      ibdata1              mysql.sock.lock             undo_002
[root@bogon data]# rm -rf *                           ##将data目录中的数据删除,来模拟故障[root@bogon backup]# cd data
[root@bogon data]# mv * /usr/local/mysql/data/       ##将备份号data文件重新复制过去[root@bogon mysql]# systemctl start mysqld  ##启动mysql数据库mysql> show databases;         ##进入到数据库查看数据
+--------------------+
| Database           |
+--------------------+
| db1  

2,mysqldump备份与恢复

语法:

mysqldump -u(指定用户) -p(指定密码) 库名 [表名1] 表名2]  > /备份路径/备份文件名

mysql> create database mysqldb;       ##创建数据库和表
Query OK, 1 row affected (0.01 sec)mysql> use mysqldb;
Database changed
mysql> create table usert1(user_name char(20),user_pass char(40)); ##在表里面添加数据
Query OK, 0 rows affected (0.02 sec)##将数据备份到/opt/backup中并重命名为mysqldb.sql
[root@bogon backup]# mysqldump -uroot -ppwd123 mysqldb usert1 > /opt/backup/mysqldb.sql
drop table usert1          ##备份完成后删除usert1表[root@bogon backup]# mysql -uroot -ppwd123 mysqldb < mysqldb.sql  ##将备份好的数据进行恢复##查看数据的恢复情况
mysql> show tables;
+-------------------+
| Tables_in_mysqldb |
+-------------------+
| usert1            |
+-------------------+
1 row in set (0.00 sec)mysql> desc usert1;
+-----------+----------+------+-----+---------+-------+
| Field     | Type     | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| user_name | char(20) | YES  |     | NULL    |       |
| user_pass | char(40) | YES  |     | NULL    |       |
+-----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
  • 基于二进制文件进行恢复
[root@bogon ~]# vim /etc/my.cnf         ##在此文件中[mysqld]添加三行
log-bin=/usr/local/mysql/mysql-bin       ##启用二进制日志
binlog_format=MIXED                        ##定义二进制日志的记录格式为混合模式
server-id=1                                    ##为mysql分配一个唯一的服务器标识符
[root@bogon ~]# systemctl restart mysqld   ##重启mysqld服务

[root@bogon /]# cd /usr/local/mysql/           ##/usr/local/mysql/中会生成一个mysql-bin.000001的二进制文件
[root@bogon mysql]# lsmysql-bin.000001  [root@bogon mysql]# mysqlbinlog mysql-bin.000001   ##使用此命令查看文件里面会又之前mysql数据库的命令
create database db1
create table t1(user_name char(20),user_pass char(40))mysql> drop database db1;             ##删除db1数据库
Query OK, 1 row affected (0.01 sec) ##使用命令恢复db1数据库
[root@bogon mysql]# mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -ppwd123mysqladmin -uroot -ppwd123 flush-logs  ##刷新日志会生成新的日志文件mysql-bin.000002
  • 基于二进制文件位置进行恢复
mysql> create database aaa;       ##创建数据库
Query OK, 1 row affected (0.00 sec)mysql> use aaa;
Database changed
mysql> create table bbb(user_name char(20),user_pass char(40));
Query OK, 0 rows affected (0.05 sec)##往表里面添加数据
mysql> insert into bbb values('zhangsan','123'),('lisi','456'),('wangwu','789');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
+-----------+-----------+
3 rows in set (0.00 sec)mysql> insert into bbb values('ccc','000');    ##单独插入一个用户方便验证
Query OK, 1 row affected (0.00 sec)##刷新日志
[root@bogon mysql]# mysqladmin -uroot -ppwd123 flush-logs

BEGIN          ##开始位置
/*!*/;
# at 1644
#250509  8:36:33 server id 1  end_log_pos 1754 CRC32 0x1919625c 	Query	thread_i
SET TIMESTAMP=1746750993/*!*/;
insert into bbb values('ccc','000')
/*!*/;
# at 1754
#250509  8:36:33 server id 1  end_log_pos 1785 CRC32 0xb5f69b37 	Xid = 74
COMMIT/*!*/;       ##结束位置Database changed
mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
+-----------+-----------+
4 rows in set (0.00 sec)mysql> delete from bbb where user_name="ccc";           ##删除ccc用户
Query OK, 1 row affected (0.00 sec)mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
+-----------+-----------+
3 rows in set (0.00 sec)

 验证

##恢复指定位置的内容
[root@bogon mysql]# mysqlbinlog --no-defaults --start-position='1644' --stop-position='1754' mysql-bin.000002 | mysql -uroot -ppwd123##查看恢复情况
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
+-----------+-----------+
4 rows in set (0.00 sec)

  • 基于二进制文件时间进行恢复
mysql> insert into bbb values('ddd','999');
Query OK, 1 row affected (0.00 sec)mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
| ddd       | 999       |
+-----------+-----------+
5 rows in set (0.00 sec)BEGIN
/*!*/;
# at 929
#250509  8:47:58 server id 1  end_log_pos 1039 CRC32 0xa963fcd4 	Query	thread_id=21	exec_time=0	error_code=0
SET TIMESTAMP=1746751678/*!*/;
insert into bbb values('ddd','999')
/*!*/;
# at 1039
#250509  8:47:58 server id 1  end_log_pos 1070 CRC32 0xe7b5c0fc 	Xid = 126
COMMIT/*!*/;

验证 

mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
| ddd       | 999       |
+-----------+-----------+
5 rows in set (0.00 sec)mysql> delete from bbb where user_name="ddd";         ##删除ddd用户
Query OK, 1 row affected (0.01 sec)mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
+-----------+-----------+
4 rows in set (0.00 sec)##基于时间恢复
[root@bogon mysql]# mysqlbinlog --no-defaults --start-datetime='2025-05-09 8:47:58' --stop-datetime='2025-05-09 8:47:58' mysql-bin.000003 | mysql -uroot -ppwd123mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan  | 123       |
| lisi      | 456       |
| wangwu    | 789       |
| ccc       | 000       |
| ddd       | 999       |
+-----------+-----------+
5 rows in set (0.00 sec)

http://www.xdnf.cn/news/415423.html

相关文章:

  • C++哈希表
  • Fellou智能体调研
  • Python训练营打卡DAY23
  • c++ 类的成员初始化
  • [Windows] PicPick Professional_v7.3.4 中文专业版
  • SpringDataRedis的入门案例,以及RedisTemplate序列化实现
  • 18.three官方示例+编辑器+AI快速学习webgl_buffergeometry_points_interleaved
  • Ascend的aclgraph(五)PrimTorch TorchInductor
  • USB学习【10】描述符-HID描述符
  • Stream Deck纯软件实现高性价比平替
  • 多线程(2)——Thread类及常见方法
  • 2025年上半年软考备考攻略:关键事项提醒
  • Java知识库网站整理
  • CHIP第四次作业
  • [编程基础] PHP · 学习手册
  • Spring事务中异步操作导致数据查询失败问题分析与解决方案
  • SHA-256 哈希算法详解
  • DNS工作原理与报文解析
  • Docker快速入门与应用
  • 基于Arduino的贪吃蛇游戏机
  • 位运算题目:黑板异或游戏
  • 火山云网站搭建
  • AES-128 加密与解密详解
  • 分享AI时代数据智能人才定向就业班(暑期班)
  • 【Linux 系统调试】syslog:Linux 系统日志工具详解
  • DAY22kaggle泰坦尼克号
  • 手写 vue 源码 === watch 实现
  • 学习黑客5分钟深入浅出理解系列之Windows compmgmt
  • 配置Hadoop集群-免密登录
  • dfs第二次加训 详细题解 下