【MySQL数据库】MySQL日志管理与备份恢复

news2024/12/21 20:20:44

文章目录

  • MySQL日志
    • 1. 错误日志(Error Log)
    • 2. 通用查询日志(General Query Log)
    • 3. 二进制日志(Binary Log, Binlog)
    • 4. 慢查询日志(Slow Query Log)
    • 注意
      • 重启 MySQL 服务
      • 动态修改配置
    • MySQL日志相关查询指令
      • 1. 登录 MySQL
      • 2. 查看通用查询日志是否开启
      • 3. 查看二进制日志是否开启
      • 4. 查看慢查询日志是否开启
      • 5. 查看慢查询时间设置
      • 6. 在数据库中设置开启慢查询日志
  • 数据库备份的分类
    • 一、备份类型
    • 二、备份策略
    • 三、备份工具
  • MySQL完全备份与恢复
    • 一、创建示例数据库和表
    • 二、MySQL完全备份
      • 1. 物理冷备份与恢复
      • 2. mysqldump备份与恢复
    • 三、MySQL完全恢复
  • MySQL增量备份与恢复
    • MySQL 增量备份
      • 1. 开启二进制日志功能
      • 2. 进行完全备份
        • 3. 生成新的二进制日志文件
        • 4. 插入新数据
        • 5. 再次生成新的二进制日志文件
        • 6. 查看二进制日志文件的内容
    • MySQL 增量恢复
      • 1. 一般恢复
      • 2. 断点恢复
  • PXB备份与恢复
    • 下载并安装Percona XtraBackup
    • XtraBackup工具简介
    • 常用选项说明
    • 创建最小权限备份用户
    • 备份操作
      • 备份所有数据库,自动生成日期命名的文件夹
      • 备份所有数据库,指定目录名称
      • 压缩打包备份
      • 备份到远程主机并压缩
      • 备份指定数据库或表
      • 增量备份
    • 完全恢复
    • 增量恢复
      • 1. 停止 MySQL 服务
      • 2. 备份当前数据目录
      • 3. 合并增量备份到全量备份
      • 4. 完成数据的预备操作
      • 5. 恢复数据
    • xtrabackup 备份数据库流程
      • 1. 执行全量备份
    • xtrabackup 恢复数据库流程
      • 1. 停止 MySQL 服务
      • 2. 备份当前数据目录
      • 3. 准备备份数据
      • 4. 恢复数据
  • 要点总结
    • 备份类型
    • 备份策略
    • 备份工具
    • 完全备份
      • 物理冷备:
    • mysqldump逻辑热备
      • 恢复
        • 方法一:使用命令行导入
        • 方法二:使用MySQL客户端执行
    • 增量备份
      • 查看二进制日志内容
      • 使用二进制日志文件增量恢复
    • 断点恢复
      • 基于位置点的断点恢复
      • 基于时间点的断点恢复
      • 断点恢复原则

MySQL日志

MySQL 日志管理对于数据库管理员(DBA)和开发人员来说是至关重要的,因为它不仅可以帮助他们监控数据库的运行状态,还能在数据库出现问题时提供调试和恢复的关键信息。

1. 错误日志(Error Log)

  • 作用:记录当 MySQL 启动、停止或运行时发生的错误信息。
  • 默认状态:默认已开启。
  • 配置:通过 log-error 参数指定日志的保存位置和文件名。
    [mysqld]
    log-error=/usr/local/mysql/data/mysql_error.log
    
  • 查看:错误日志通常不需要手动查看,但当数据库启动失败或运行中出现严重错误时,DBA 会查看此日志以诊断问题。

2. 通用查询日志(General Query Log)

  • 作用:记录 MySQL 的所有连接和语句,包括每个客户端的连接、断开以及执行的 SQL 语句。
  • 默认状态:默认是关闭的。
  • 配置:通过 general_loggeneral_log_file 参数开启并指定日志文件。
    [mysqld]
    general_log=ON
    general_log_file=/usr/local/mysql/data/mysql_general.log
    
  • 查看:通过 SQL 命令 SHOW VARIABLES LIKE 'general%'; 可以检查通用查询日志是否开启。
  • 用途:主要用于调试和审计,但会记录大量信息,可能影响性能,因此不建议在生产环境中长期开启。

3. 二进制日志(Binary Log, Binlog)

  • 作用:记录所有更新了数据或者已经潜在更新了数据的语句(如 INSERTUPDATEDELETE 等),以及数据定义语句(如 CREATE TABLEALTER TABLE 等)。用于数据恢复和复制。
  • 默认状态:默认已开启,但文件名和位置可能因安装而异。
  • 配置:通过 log-bin 参数指定二进制日志文件的名称前缀。
    [mysqld]
    log-bin=mysql-bin
    
  • 查看:通过 SQL 命令 SHOW VARIABLES LIKE 'log_bin%'; 可以检查二进制日志是否开启及其配置。
  • 用途:是 MySQL 复制和数据恢复的基础。

4. 慢查询日志(Slow Query Log)

  • 作用:记录所有执行时间超过 long_query_time 秒的语句,帮助识别和优化性能低下的查询。
  • 默认状态:默认是关闭的。
  • 配置:通过 slow_query_logslow_query_log_filelong_query_time 参数开启并配置慢查询日志。
    [mysqld]
    slow_query_log=ON
    slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
    long_query_time=5
    
  • 查看:通过 SQL 命令 SHOW VARIABLES LIKE '%slow%';SHOW VARIABLES LIKE 'long_query_time'; 可以检查慢查询日志是否开启及其配置。
  • 用途:性能调优,识别和优化执行时间长的查询。

注意

重启 MySQL 服务

配置修改后,需要重启 MySQL 服务使配置生效:

systemctl restart mysqld

动态修改配置

某些配置(如慢查询日志)可以在 MySQL 运行时通过 SQL 命令动态修改,而无需重启服务:

SET GLOBAL slow_query_log = ON;

注意,动态修改的配置在 MySQL 服务重启后会失效,要永久生效还需修改配置文件。
当然,下面是对您提供的 MySQL 命令和查询的详细讲解:

MySQL日志相关查询指令

1. 登录 MySQL

mysql -u root -p

这个命令用于登录 MySQL 数据库服务器。-u root 指定使用 root 用户进行登录,-p 会提示您输入该用户的密码。成功登录后,您将能够执行 SQL 命令来管理和查询数据库。

2. 查看通用查询日志是否开启

SHOW VARIABLES LIKE 'general%';

这个 SQL 查询用于查看与通用查询日志(General Query Log)相关的系统变量。general_log 变量表示通用查询日志是否开启(ONOFF),general_log_file 变量表示日志文件的路径。

  • 如果 general_log 的值为 ON,则表示通用查询日志已开启。
  • 如果 general_log 的值为 OFF,则表示通用查询日志未开启。

3. 查看二进制日志是否开启

SHOW VARIABLES LIKE 'log_bin%';

这个 SQL 查询用于查看与二进制日志(Binary Log)相关的系统变量。log_bin 变量表示二进制日志是否开启(如果设置了值,则表示开启;如果为空,则表示未开启),log_bin_basenamelog_bin_index 变量分别表示二进制日志文件的基本名称和索引文件的路径(这些变量可能在某些 MySQL 版本中有所不同,但 log_bin 是关键变量)。

  • 如果 log_bin 有设置值(如 mysql-bin),则表示二进制日志已开启。
  • 如果 log_bin 为空,则表示二进制日志未开启。

4. 查看慢查询日志是否开启

SHOW VARIABLES LIKE '%slow%';

这个 SQL 查询用于查看与慢查询日志(Slow Query Log)相关的系统变量。slow_query_log 变量表示慢查询日志是否开启(ONOFF),slow_query_log_file 变量表示日志文件的路径。

  • 如果 slow_query_log 的值为 ON,则表示慢查询日志已开启。
  • 如果 slow_query_log 的值为 OFF,则表示慢查询日志未开启。

5. 查看慢查询时间设置

SHOW VARIABLES LIKE 'long_query_time';

这个 SQL 查询用于查看 long_query_time 系统变量的值,它表示慢查询的阈值时间(秒)。只有执行时间超过这个阈值的查询才会被记录到慢查询日志中。

  • long_query_time 的值可以是任何正数,表示秒数。
  • 默认值可能是 10 秒,但可以根据需要进行调整。

6. 在数据库中设置开启慢查询日志

SET GLOBAL slow_query_log = ON;

这个 SQL 命令用于在 MySQL 运行时动态地开启慢查询日志。注意,这个更改是临时的,仅在当前 MySQL 服务器会话期间有效。要永久地开启慢查询日志,您需要修改 MySQL 的配置文件(如 my.cnfmy.ini),并重启 MySQL 服务。

  • 执行此命令后,您可以通过再次运行 SHOW VARIABLES LIKE 'slow_query_log'; 来验证慢查询日志是否已开启。

数据库备份的分类

一、备份类型

  1. 物理备份

    • 定义:直接复制数据库的物理文件,包括数据文件、日志文件、配置文件等。
    • 优点:备份和恢复操作相对简单,恢复速度快,能够跨MySQL版本进行恢复。
    • 缺点:需要在数据库离线或只读状态下进行,可能影响业务连续性。
    • 适用场景:适用于对数据库一致性要求较高,且可以接受短暂停机时间的场景。
  2. 逻辑备份

    • 定义:导出数据库对象(如库、表)的数据和结构,生成SQL语句或其他格式的备份文件。
    • 优点:备份结果为ASCII文件,可以编辑;与存储引擎无关,可以通过网络进行备份和恢复。
    • 缺点:备份和恢复过程需要MySQL服务器进程参与,可能占用较多时间和空间;浮点数可能会丢失精度;恢复后索引需要重建。
    • 适用场景:适用于对数据库一致性要求不是特别高,且需要跨平台或跨版本恢复数据的场景。

二、备份策略

  1. 完全备份(全量备份)

    • 定义:每次都备份完整的库或表数据。
    • 优点:恢复时简单直接,只需恢复一个完整的备份文件即可。
    • 缺点:占用存储空间大,备份时间长。
    • 适用场景:适用于数据量不大,或可以接受较长备份时间的场景。
  2. 差异备份

    • 定义:只备份上一次完全备份后的更新数据。
    • 优点:相对于完全备份,差异备份可以节省存储空间和时间。
    • 缺点:恢复时需要先恢复完全备份,再恢复差异备份,过程相对复杂。
    • 适用场景:适用于数据量较大,且需要频繁备份的场景。
  3. 增量备份

    • 定义:只备份上一次完全备份或增量备份后的更新数据,即每次都只备份最新的数据。
    • 优点:进一步节省存储空间和时间,且恢复时只需恢复完全备份和最近的增量备份。
    • 缺点:恢复过程相对复杂,需要按照备份顺序依次恢复。
    • 适用场景:适用于数据量非常大,且需要频繁备份和恢复的场景。

三、备份工具

  1. tar等压缩打包工具

    • 用于物理冷备,即将数据库文件压缩打包成备份文件。
    • 优点:操作简单,恢复速度快。
    • 缺点:需要在数据库离线状态下进行,可能影响业务连续性。
  2. MySQL自带的备份工具

    • mysqldump:用于逻辑备份,可以生成包含SQL语句的备份文件。支持完全备份、部分备份(如指定数据库、表、数据或结构等)。
    • mysqlhotcopy:用于物理热备,但仅支持MyISAM和ARCHIVE表。通过复制数据库文件来创建备份。
  3. 刷新二进制日志

    • 用于增量备份,通过记录二进制日志的位置来实现增量数据的备份和恢复。
  4. 第三方备份工具Percona XtraBackup(PXB)

    • 用于物理热备,支持完全备份和增量备份。
    • 优点:备份过程快速可靠,不会打断正在执行的事务;支持在线备份,无需停止数据库服务;提供自动备份验证功能,确保备份数据的可用性。
    • 缺点:相对于MySQL自带的备份工具,可能需要额外的安装和配置。

MySQL完全备份与恢复

一、创建示例数据库和表

-- 切换到xy101数据库(如果数据库不存在,需要先创建)
use xy101;

-- 如果info1表不存在,则创建该表
create table if not exists info1 (
    id int(4) not null auto_increment, -- 自增主键
    name varchar(10) not null,         -- 用户名
    sex char(10) not null,             -- 性别
    hobby varchar(50),                 -- 爱好
    primary key (id)                   -- 主键约束
);

-- 向info1表中插入两条记录
insert into info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');

二、MySQL完全备份

1. 物理冷备份与恢复

物理冷备份是在数据库停止服务的情况下进行的备份,因为此时数据库文件不会被修改,保证了数据的一致性。

# 停止MySQL服务
systemctl stop mysqld

# 安装xz压缩工具(如果未安装)
yum -y install xz

# 使用tar命令进行压缩备份,将/usr/local/mysql/data/目录下的所有文件压缩成.tar.xz格式的备份文件
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/

# 解压恢复过程(模拟)
# 首先将/usr/local/mysql/data/目录移动到其他位置(模拟数据丢失)
mv /usr/local/mysql/data/ ~

# 然后解压备份文件到/usr/local/mysql/目录下
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/
# 注意:这里的日期“2020-11-22”应该替换为实际的备份文件日期

# 最后将解压后的数据目录移动回原位置(恢复完成)
mv /opt/usr/local/mysql/data/ /usr/local/mysql/
# 注意:这里的路径可能需要根据实际情况进行调整,上面的命令中路径多了一个“/opt/”,应去除

注意:物理备份恢复时,需要确保MySQL的数据目录是空的,或者与备份文件中的数据目录结构一致。

2. mysqldump备份与恢复

mysqldump是MySQL自带的逻辑备份工具,它可以导出数据库的结构和数据,生成SQL脚本文件。

# 完全备份一个或多个完整的库
mysqldump -u root -p --databases xy101 > /opt/xy101.sql
# 这里需要输入root用户的密码,然后mysqldump会将xy101库导出到/opt/xy101.sql文件中

# 完全备份MySQL服务器中所有的库
mysqldump -u root -p --all-databases > /opt/all.sql
# 这将导出MySQL服务器上所有的数据库到/opt/all.sql文件中

# 完全备份指定库中的部分表
mysqldump -u root -p xy101 info1 info2 > /opt/xy101_info1.sql
# 这将导出xy101库中的info1和info2表到/opt/xy101_info1.sql文件中
# 如果使用“-d”选项,则只导出表结构,不导出数据

# 查看备份文件内容(过滤掉注释行和空行)
grep -v "^--" /opt/xy101_info1.sql | grep -v "^/" | grep -v "^$"

三、MySQL完全恢复

恢复数据库之前,需要确保MySQL服务已经启动。

# 启动MySQL服务
systemctl start mysqld

# 恢复数据库(先删除原数据库,再导入备份文件)
mysql -u root -p -e 'drop database xy101;'
# 这里需要输入root用户的密码,然后执行删除数据库的操作

# 查看当前数据库列表(确认数据库已被删除)
mysql -u root -p -e 'SHOW DATABASES;'

# 导入备份文件恢复数据库
mysql -u root -p < /opt/xy101.sql
# 这里需要输入root用户的密码,然后mysqldump会将/opt/xy101.sql文件中的SQL语句执行到MySQL服务器上,恢复数据库

# 再次查看当前数据库列表(确认数据库已恢复)
mysql -u root -p -e 'SHOW DATABASES;'

# 恢复数据表(如果备份文件中只包含表的备份,不包含库的备份)
# 首先删除原数据表(确保目标库已存在)
mysql -u root -p -e 'drop table xy101.info1;'

# 查看xy101库中的表列表(确认表已被删除)
mysql -u root -p -e 'show tables from xy101;'

# 导入备份文件恢复数据表
mysql -u root -p xy101 < /opt/xy101_info1.sql
# 这里需要指定数据库名xy101,因为备份文件中只包含了表的备份,不包含库的备份

# 再次查看xy101库中的表列表(确认表已恢复)
mysql -u root -p -e 'show tables from xy101;'

注意:在恢复数据库或数据表之前,建议先备份当前的数据(如果需要的话),以防万一恢复过程中出现问题导致数据丢失。同时,恢复操作需要谨慎执行,确保备份文件正确无误,且目标数据库或表已正确删除(如果需要的话)。

MySQL增量备份与恢复

MySQL 增量备份

1. 开启二进制日志功能

二进制日志(binlog)是MySQL的增量备份基础,它记录了所有更改数据库数据的SQL语句。

# 编辑MySQL配置文件
vim /etc/my.cnf

# 在[mysqld]部分添加以下配置
[mysqld]
log-bin=mysql-bin        # 启用二进制日志,并指定日志文件名前缀
binlog_format = MIXED    # 可选,指定二进制日志的记录格式为MIXED(混合模式),包括STATEMENT和ROW两种格式的优点
server-id = 1            # 设置服务器ID,用于主从复制等场景

# 保存并退出编辑器

# 重启MySQL服务以应用配置
systemctl start mysqld

# 检查二进制日志文件是否生成
ls -l /usr/local/mysql/data/mysql-bin.*

2. 进行完全备份

在进行增量备份之前,建议先进行完全备份,以便在需要时可以恢复到某个完整的状态

# 对xy101数据库中的info1表进行完全备份
mysqldump -u root -p xy101 info1 > /opt/xy101_info1_$(date +%F).sql

# 对xy101数据库进行完全备份
mysqldump -u root -p --databases xy101 > /opt/xy101_$(date +%F).sql
3. 生成新的二进制日志文件

通过刷新日志,可以生成新的二进制日志文件,从而记录之后的数据库更改。

# 刷新二进制日志
mysqladmin -u root -p flush-logs
4. 插入新数据

模拟数据的增加或变更。

# 切换到xy101数据库
use xy101;

# 插入新数据
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');
5. 再次生成新的二进制日志文件

再次刷新日志,以记录更多的数据库更改。

# 再次刷新二进制日志
mysqladmin -u root -p flush-logs
6. 查看二进制日志文件的内容

使用mysqlbinlog工具查看二进制日志文件的内容。

# 将二进制日志文件复制到/opt/目录
cp /usr/local/mysql/data/mysql-bin.000002 /opt/

# 使用mysqlbinlog查看日志文件内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

MySQL 增量恢复

1. 一般恢复

(1)模拟丢失更改的数据的恢复步骤:

# 切换到xy101数据库
use xy101;

# 删除两条记录以模拟数据丢失
delete from info1 where id=3;
delete from info1 where id=4;

使用mysqlbinlog恢复丢失的数据:

# 使用mysqlbinlog从二进制日志中恢复数据
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

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

# 删除info1表以模拟数据完全丢失
drop table info1;

首先使用完全备份恢复数据,然后使用二进制日志恢复增量数据:

# 使用完全备份恢复数据
mysql -u root -p xy101 < /opt/xy101_info1_2020-11-22.sql

# 使用mysqlbinlog从二进制日志中恢复增量数据
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

2. 断点恢复

通过指定位置或时间点,可以实现更精细的恢复。
(1)基于位置恢复:

# 仅恢复到操作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

(2)基于时间点恢复:

# 仅恢复到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

注意:在进行恢复操作时,请确保已经备份了当前的数据(如果需要的话),以防万一恢复过程中出现问题导致数据进一步丢失。同时,恢复操作需要谨慎执行,确保二进制日志文件正确无误,且目标数据库已处于适当的状态(例如,完全备份已恢复,或表已存在但数据已删除)。

PXB备份与恢复

下载并安装Percona XtraBackup

# 使用wget下载Percona XtraBackup的RPM包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

# 使用yum安装下载的RPM包
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

XtraBackup工具简介

XtraBackup主要包含两个工具:

  • xtrabackup:用于热备份InnoDB和XtraDB表数据,不支持其他类型的表或数据表结构。
  • innobackupex:是xtrabackup的Perl封装脚本,支持备份MyISAM表。

常用选项说明

--host: 指定MySQL服务器的主机名或IP地址。
--user: 指定连接MySQL服务器的用户名。
--password: 指定连接MySQL服务器的密码。
--port: 指定MySQL服务器的端口号。
--database: 指定要备份的数据库。
--incremental: 创建增量备份。
--incremental-basedir: 指定包含完整备份的目录。
--incremental-dir: 指定包含增量备份的目录。
--apply-log: 对备份进行预处理操作,应用日志以准备恢复。

创建最小权限备份用户

# 创建一个名为bkuser的用户,密码为bk123456
create user 'bkuser'@'localhost' identified by 'bk123456';
flush privileges;  # 刷新授权表

# 回收新用户所有权限
revoke all privileges,grant option from 'bkuser'@'localhost';
flush privileges;  # 再次刷新授权表

# 授予必要的权限:刷新权限、锁表、查看服务器状态、进程
grant reload,lock tables,replication client,process ON *.* TO 'bkuser'@'localhost';
flush privileges;  # 最后一次刷新授权表

备份操作

备份所有数据库,自动生成日期命名的文件夹

# 创建备份目录
mkdir -p /data/backup/

# 使用innobackupex进行备份,备份文件会放在/data/backup/下以当前时间命名的目录中
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock /data/backup/

备份所有数据库,指定目录名称

# 直接指定备份目录,不使用时间戳
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --no-timestamp /data/backup/full/

压缩打包备份

# 创建临时目录用于存放压缩前的备份
mkdir /data/backup/temp

# 使用innobackupex进行备份并通过管道传递给gzip进行压缩
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --stream=tar --no-timestamp /data/backup/temp | gzip > /data/backup/temp/backup.tar.gz

备份到远程主机并压缩

# 配置SSH密钥认证
ssh-keygen 
ssh-copy-id 192.168.80.14

# 使用innobackupex进行备份并通过SSH传输到远程主机进行压缩
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --stream=tar /data/backup | ssh root@192.168.80.14 "gzip > /opt/backup.tar.gz"

备份指定数据库或表

# 备份指定的数据库
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --databases="mydb" --no-timestamp /data/backup/mydb_database

# 备份不同库下的不同表
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --databases="mydb01.test01 mydb02.test02" --no-timestamp /data/backup/mydb_test_tables

# 备份指定库下以特定字母开头的表
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --include="mydb.xy" --no-timestamp /data/backup/mydb_xy_tables

增量备份

# 完整备份
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --no-timestamp /data/backup/full/

# 基于完整备份的增量备份
innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=bk123456 --socket=/usr/local/mysql/mysql.sock --no-timestamp --incremental /data/backup/increment --incremental-basedir=/data/backup/full/

完全恢复

# 停止MySQL服务
systemctl stop mysqld

# 移动原数据目录
mv /usr/local/mysql/data /usr/local/mysql/data_bak1

# 准备备份数据(应用日志)
innobackupex --apply-log /data/backup/full/

# 检查备份状态,确保为full-prepared
cat /data/backup/full/xtrabackup_checkpoints

# 恢复数据
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/

# 修改数据目录的拥有者为mysql用户
chown -R mysql:mysql /usr/local/mysql/data

# 启动MySQL服务
systemctl start mysqld

增量恢复

1. 停止 MySQL 服务

# 停止 MySQL 服务以避免数据写入导致的不一致
systemctl stop mysqld

2. 备份当前数据目录

# 将当前的数据目录移动到一个备份位置,以防恢复失败时能够恢复原始数据
mv /usr/local/mysql/data  /usr/local/mysql/data_bak2

3. 合并增量备份到全量备份

# 应用全量备份的日志,使其准备好接受增量备份
innobackupex --apply-log --redo-only /data/backup/full/

# 将第一个增量备份应用到全量备份上
innobackupex --apply-log --redo-only /data/backup/full/ --incremental-dir=/data/backup/increment/
# 注意:如果有多个增量备份,需要按照时间顺序逐个应用

4. 完成数据的预备操作

# 最后一个增量备份应用完成后,进行最终的数据预备操作,使数据文件完全一致
innobackupex --apply-log /data/backup/full/

5. 恢复数据

# 将预备好的数据复制回数据目录
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/

# 更改数据目录的拥有者为 MySQL 用户
chown -R mysql:mysql /usr/local/mysql/data

# 启动 MySQL 服务
systemctl start mysqld

xtrabackup 备份数据库流程

1. 执行全量备份

# 使用 xtrabackup 工具执行数据库的全量备份
xtrabackup --backup --user=bkuser --password=bk123456 --port=3306 --target-dir=/data/backup/full/
# 这里的 --user, --password, --port 分别指定了数据库用户名、密码和端口号,--target-dir 指定了备份存放的目录

xtrabackup 恢复数据库流程

1. 停止 MySQL 服务

# 停止 MySQL 服务以避免数据写入导致的不一致
systemctl stop mysqld

2. 备份当前数据目录

# 将当前的数据目录移动到一个备份位置,以防恢复失败时能够恢复原始数据
mv /usr/local/mysql/data  /usr/local/mysql/data_bak3

3. 准备备份数据

# 对备份数据进行准备操作,使其可以被恢复
xtrabackup --prepare --target-dir=/data/backup/full/

4. 恢复数据

# 将准备好的数据复制回数据目录
xtrabackup --copy-back --target-dir=/data/backup/full/

# 更改数据目录的拥有者为 MySQL 用户
chown -R mysql:mysql /usr/local/mysql/data

# 启动 MySQL 服务
systemctl start mysqld

要点总结

备份类型

备份类型描述
物理备份直接对数据库的物理文件(数据文件、日志文件等)进行备份
逻辑备份对数据库对象(库、表)的数据以SQL语句的形式导出进行备份

备份策略

备份策略描述
完全备份每次都备份完整的库或表数据
差异备份只备份上一次完全备份后的更新数据
增量备份只备份上一次完全备份或增量备份后的更新数据

备份工具

备份工具备份类型描述
tar完全备份,物理冷备使用tar等方式压缩打包数据库文件
mysqldump完全备份,逻辑热备MySQL自带的备份工具,导出数据库对象的数据为SQL语句
mysqlhotcopy完全备份,逻辑热备MySQL自带的备份工具,仅支持MyISAM和ARCHIVE表
刷新二进制日志增量备份通过刷新二进制日志实现增量备份
Percona XtraBackup完全备份、增量备份,物理热备第三方备份工具,支持完全备份和增量备份,且为物理热备

完全备份

物理冷备:

  • 先关闭mysql数据库
systemctl stop mysqld
  • 使用tar命令压缩打包备份数据库的数据目录和文件(看mysql配置文件中的 datadir 配置参数)

恢复:
使用tar命令解压备份文件压缩包,将数据目录进行替换

mysqldump逻辑热备

命令功能备注
mysqldump -u 用户 -p密码 --databases 库1 [库2 ....] > XXX.sql备份一个或多个指定的库及库中所有的表备份指定数据库及其所有表
mysqldump -u 用户 -p密码 --all-databases > XXX.sql备份所有库备份MySQL服务器中所有数据库
mysqldump -u 用户 -p密码 库名 > XXX.sql只备份指定库中的所有表(不包含库对象本身)备份指定数据库中的所有表,不包括创建数据库的语句
mysqldump -u 用户 -p密码 库名 表1 [表2 ....] > XXX.sql只备份指定库中的一个或多个指定的表(不包含库对象本身)备份指定数据库中的特定表,不包括创建数据库的语句

使用说明

  • -u 用户:指定连接MySQL的用户名。
  • -p密码:指定连接MySQL的密码(注意:实际使用时,-p后面直接跟密码可能会带来安全风险,建议使用-p后空格再输入密码,或者使用配置文件等方式来管理密码)。
  • --databases 库名1 [库名2] …:指定要备份的一个或多个数据库名称。
  • --all-databases:备份所有数据库。
  • 库名:指定要备份的数据库名称。
  • 表1 [表2 …]:指定要备份的表名称。
  • > XXX.sql:将备份数据输出到指定的SQL文件中。
  • -d:只备份表结构
  • -F:备份后生成新的二进制日志文件
  • --lock-tables:备份前锁定表
    以下是对MySQL数据库恢复方法的整理,分为两个表格,分别对应两种恢复方法:

恢复

方法一:使用命令行导入
命令功能备注
mysql -u 用户 -p密码 [库名] < XXX.sql恢复数据库或表将SQL文件的内容导入到数据库中
`cat XXX.sqlmysql -u 用户 -p密码 [库名]`恢复数据库或表
方法二:使用MySQL客户端执行
步骤命令功能备注
1登录MySQL连接到MySQL服务器使用mysql -u 用户 -p密码命令登录
2use 库名切换到目标数据库如果SQL文件只包含表结构或数据,需要先切换到目标数据库
3source XXX.sql文件路径执行SQL文件在当前数据库上下文中执行SQL文件,恢复表结构或数据
  • 对于方法一,可以直接在命令行中使用mysql命令将SQL文件的内容导入到数据库中。如果指定了库名,则数据将被导入到该库中;如果没有指定库名,则根据SQL文件中的创建库语句创建库并导入数据。
  • 对于方法二,需要先登录到MySQL客户端,然后切换到目标数据库(如果需要),最后执行source命令来恢复表结构或数据。
    以下是对MySQL增量备份和恢复方法的整理,以表格形式呈现:

增量备份

命令功能备注
mysqldump -u root -p密码 flush-logs刷新二进制日志,准备进行增量备份刷新二进制日志文件,生成新的二进制日志文件用于增量备份

查看二进制日志内容

命令功能备注
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件路径查看二进制日志内容解码并显示二进制日志文件的内容,方便检查

使用二进制日志文件增量恢复

命令功能备注
`mysqlbinlog --no-defaults 二进制日志文件路径mysql -u 用户 -p密码`使用二进制日志文件进行增量恢复
以下是对MySQL断点恢复方法的整理,分为两个表格,分别对应基于位置点和基于时间点的恢复:

断点恢复

基于位置点的断点恢复

命令功能备注
mysqlbinlog --no-defaults --start-position='起始位置点' --stop-position='结束位置点' 二进制日志文件路径恢复指定位置范围内的数据使用起始和结束位置点来限定恢复的数据范围

基于时间点的断点恢复

命令功能备注
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-datetime='YYYY-mm-dd HH:MM:SS' 二进制日志文件路径恢复指定时间范围内的数据使用起始和结束时间点来限定恢复的数据范围

断点恢复原则

原则描述
start如果要恢复某条SQL语句及其之后的所有数据,就从这个语句的位置点或时间点开始
stop如果要恢复到某条SQL语句之前的所有数据,就stop在这个语句前一个的位置点或时间点
  • 对于基于位置点的恢复,需要知道具体的起始和结束位置点,可以通过查看二进制日志文件来确定。
  • 对于基于时间点的恢复,需要知道具体的起始和结束时间点,可以根据业务需求来设定。
  • 使用mysqlbinlog命令结合mysql命令可以实现断点恢复,将指定范围内的二进制日志内容导入到数据库中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26K star!学习AI也不难,这个项目讲的非常全

马上就要2024年了&#xff0c;谁不想学习一下AI相关的知识呢&#xff1f;怎么开始上手一直困扰着很多初学者&#xff0c;现在网上也充斥着各种搬运的垃圾课程&#xff0c;更是让人难以选择&#xff0c;我们就是希望帮初学者避开那些垃圾内容。 今天我们推荐的开源项目是微软推…

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量&#xff1b; Go语言版本&#xff1a;1.23.2 Windows版本&#xff1a;win11&#xff08;win10通用&#xff09; 下载Go环境 下载go环境&#xff1a;Go下载官网链接(https://golang.google.cn/dl/) 等待…

阿里大佬带你一周刷完 Java 面试八股文,比刷视频效果好多了

今天在脉脉刷到了这么一条消息&#xff0c;现在这个大环境&#xff0c;都后悔学 Java 了&#xff0c;想转行学前端&#xff0c; 看完很是震惊&#xff0c;据大数据统计&#xff0c;Java 的待遇是要好过前端的。小伙伴竟然被卷到想要转行......但是行情这个东西&#xff0c;也不…

Python实时视频流+网络摄像头+视频检测流程播放

实时视频处理 概述需求网络摄像头推流流媒体服务器查看设备视频、音频设备列表查看指定设备配置信息 不编码、指定分辨率推流编码加速python服务端处理多线程最终的处理方式 问题与分析 概述 一款桌面应用&#xff0c;可以配置视频处理参数&#xff0c;根据参数播放网络摄像头…

MySQL 8.4.0解压版安装记录

这几天&#xff0c;安装最新版mysql 8.4的时候&#xff0c;遇到了不少问题&#xff0c;网上的教程大多数都是旧版本的&#xff0c;也安装不成功。 参考了大量教程后&#xff0c;经过自己的摸索终于装好了&#xff0c;这里记录一下。 我下载的是8.4.0 LTS MySQL :: Download …

智绘城市地图:使用百度地图 API 实现智能定位

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

全网最易详解-数据仓库分区详解

最近要搭某个业务域的数仓&#xff0c;本来设计规划的挺好的&#xff0c;该搭DIM,DWD,DWS的也都设计好了&#xff0c;结果一跑数仓&#xff0c;全是大大小小的BUG&#xff0c;最后揪出来整个过程&#xff0c;最大的烦人东西就是设计ETL数据入库分区的问题。 那么这时候肯定有…

AI大模型学习路线,只看这一篇就够了!

1. 打好基础&#xff1a;数学与编程 数学基础 线性代数&#xff1a;理解矩阵、向量、特征值、特征向量等概念。 推荐课程&#xff1a;Khan Academy的线性代数课程、MIT的线性代数公开课。 微积分&#xff1a;掌握导数、积分、多变量微积分等基础知识。 推荐课程&#xff1a…

【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、为什么学习xpath和lxml &#xff08;一&#xff09;高效解析和提取数据 …

【软件】Ubuntu下QT的安装和使用

【软件】Ubuntu下QT的安装和使用 零、前言 QT是应用得比较广泛的程序框架&#xff0c;是因为其跨平台特性比较好&#xff0c;且用C/C作为开发语言&#xff0c;性能也比较好&#xff0c;故本文介绍如何安装和使用QT&#xff0c;用的版本是QT 6.2.4&#xff0c;由于QT在Windows…

windows安装deepspeed setup.py 207行找不到文件

一直报莫名奇妙的错误&#xff0c;查了半天也没查到 去看了一下源码&#xff0c;需要安装git&#xff0c;我没有安装 git命令获得信息也没啥用 直接注释掉 成功运行

HazyDet数据集:包含 383,000 雾霾场景中基于无人机的目标检测设计的大规模数据集

2024-09-30&#xff0c;由中国人民解放军陆军工程大学、南开大学、南京邮电大学和南京理工大学的研究人员联合创建了HazyDet数据集&#xff0c;目的解决无人机在恶劣天气条件下的环境感知问题。这个数据集的推出&#xff0c;极大地填补了相关基准测试的空白&#xff0c;为无人机…

Windows系统部署redis自启动服务

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…

Langchain CharacterTextSplitter无法分割文档问题

在使用Langchain的文档分割器时&#xff0c;使用CharacterTextSplitter拆分文档是&#xff0c;发现返回的文档根本没有变化&#xff0c;即使设置了chunk_size&#xff0c;返回的大小也不符合参数设置。 CharacterTextSplitter设置了150&#xff0c;但是根本没有处理&#xff0…

软件测试学习笔记丨Linux三剑客-sed

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32521 一、简介 sed&#xff08;Stream editor&#xff09;是一个功能强大的文本流编辑器&#xff0c;主要用于对文本进行处理和转换。它适用于自动化处理大量的文本数据&#xff0c;能够支持…

ASML业绩暴雷,股价一度跌超16%

KlipC报道&#xff1a;当地时间10月15日&#xff0c;阿斯麦&#xff08;ASML&#xff09;原定于周三公布的三季度业绩报告由于技术原因被短暂地提前公布&#xff0c;业绩报告显示&#xff0c;阿斯麦第三季度总净销售额75亿欧元&#xff0c;毛利率50.8%&#xff0c;净利润21亿欧…

NoMachine安装使用

目录 前言 一、安装教程 1) 首先下载 NoMachine 软件 Linux arm64 deb 版本的安装包&#xff0c;然后安装到开发板的Linux 系统中 a. 由于 RK3588S 是 ARMv8 架构的 SOC&#xff0c;我们使用的系统为 Ubuntu 或者Debian&#xff0c;所以这里需要下载 NoMachine for ARM ARM…

C++ 模板(基础)

前言&#xff1a; C 中的模板是一个强大的功能&#xff0c;允许程序员编写通用的代码&#xff0c;这些代码可以处理任何数据类型。模板使得代码更加灵活和可重用&#xff0c;而不必为每种数据类型编写重复的代码。下面详细解释 C 中的模板 内容摘要&#xff1a; 本文内容包含…

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…

传输层协议UDP详解

目录 一. 知识准备 1.1 传输层 1.2 重识端口号 二. UDP协议 三. UDP协议特点 一. 知识准备 1.1 传输层 前面已经讲过&#xff0c;HTTP协议是应用层协议&#xff0c;在此之前&#xff0c;我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道&…