OpenEuler系统MySQL备份恢复全攻略

OpenEuler 系统 MySQL 数据库备份与恢复超详细教程

本教程全程适配 OpenEuler 20.03/22.03/24.03 LTS 主流版本,覆盖从入门级逻辑备份到生产级物理热备、增量备份与时间点恢复全场景,所有命令均可直接复制执行,附带完整参数解释与避坑指南。

一、前置环境准备与基础配置

1. 环境说明与前提

  • 系统:OpenEuler LTS 系列版本
  • 数据库:MySQL 5.7/8.0 (MariaDB 操作逻辑完全兼容)
  • 权限:所有操作需使用 root 用户或具备 sudo 权限的普通用户
  • 前提:MySQL 服务已正常安装并运行

2. MySQL 服务状态检查

执行以下命令确认服务正常运行,备份前必须保证服务处于正常状态

复制代码
# 查看服务运行状态
systemctl status mysqld
# MariaDB对应命令:systemctl status mariadb
# 验证MySQL登录可用性
mysql -u root -p -e "SELECT VERSION();"

3. 专用备份用户创建与权限配置

生产环境禁止直接使用 root 用户备份,需创建专用备份用户并授予最小必要权限

  1. 登录 MySQL 命令行

    mysql -u root -p

  2. 创建备份用户并授权

    -- 创建本地备份用户(替换为你的备份密码)
    CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'Backup@123456';
    -- 授予备份所需核心权限
    GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, SELECT, SHOW VIEW, EVENT, TRIGGER ON . TO 'backup_user'@'localhost';
    -- MySQL 8.0 热备需额外添加BACKUP_ADMIN权限
    GRANT BACKUP_ADMIN ON . TO 'backup_user'@'localhost';
    -- 刷新权限生效
    FLUSH PRIVILEGES;
    exit;

  3. 权限说明

  • RELOAD:用于执行 FLUSH LOGS、FLUSH TABLES 等刷新操作
  • LOCK TABLES:用于备份时锁表保证数据一致性
  • REPLICATION CLIENT:用于获取 binlog 二进制日志位置
  • SELECT:用于读取表数据进行备份
  • BACKUP_ADMIN:MySQL 8.0 热备所需的实例备份权限

4. 核心前提:开启 binlog 二进制日志(增量恢复必备)

binlog 是 MySQL 增量备份、时间点恢复、误删数据急救的核心,必须提前开启

  1. 编辑 MySQL 主配置文件

    vim /etc/my.cnf

  2. [mysqld]段落中添加以下配置

    [mysqld]

    服务器唯一ID,单实例填1即可,主从环境需保证唯一

    server-id = 1

    开启binlog日志,指定日志文件前缀

    log_bin = mysql-bin

    binlog格式,推荐ROW行模式(数据恢复最安全,无数据丢失风险)

    binlog_format = ROW

    binlog自动过期时间,单位天,避免磁盘占满

    expire_logs_days = 7

    每次事务提交立即刷写binlog到磁盘,极致数据安全

    sync_binlog = 1

    字符集配置,避免备份恢复乱码

    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

  3. 重启 MySQL 服务使配置生效

    systemctl restart mysqld

  4. 验证 binlog 是否开启成功

    mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"

若返回结果中ValueON,则表示开启成功。

二、MySQL 备份全方案(从入门到生产级)

MySQL 备份分为逻辑备份物理备份两大类,逻辑备份兼容性强、操作简单,适合中小库;物理备份速度快、无锁影响,适合 TB 级大库生产环境。

(一)逻辑备份 1:mysqldump 自带工具全详解(兼容性最强)

mysqldump 是 MySQL 安装自带的逻辑备份工具,无需额外安装,将数据库转换成 SQL 脚本文件,跨版本、跨平台兼容性拉满,是新手入门、中小库备份的首选。

1. 核心语法与通用参数
  • 基础语法:mysqldump [选项] > 备份文件绝对路径/备份文件名.sql
  • 执行位置:必须在 OpenEuler 系统终端执行,不能在 MySQL 命令行内执行
  • 通用核心参数(生产环境必加):

表格

参数 作用说明
-u 用户名 指定 MySQL 登录用户
-p 交互式输入密码,也可直接写-p密码(无空格,不推荐,密码会明文暴露)
--single-transaction 针对 InnoDB 引擎,开启事务一致性快照,备份期间完全不锁表,不影响业务读写,生产环境必加
--routines 备份存储过程和函数
--triggers 备份触发器
--events 备份事件调度器
--master-data=2 记录 binlog 日志文件名和位点,用于增量恢复 / 主从搭建,2 表示注释状态,1 表示直接生效
--quick 逐行读取表数据,不缓存整表到内存,适合大表备份
--default-character-set=utf8mb4 指定字符集,彻底避免备份恢复乱码
--add-drop-table 建表前添加 DROP TABLE 语句,恢复时直接覆盖旧表,默认开启
2. 全场景备份命令与示例

提前创建专用备份目录,避免权限问题:

复制代码
mkdir -p /data/mysql_backup
chmod 700 /data/mysql_backup
(1)全库备份(备份整个 MySQL 实例所有数据库)
  • 基础全库备份

    mysqldump -u backup_user -p --all-databases > /data/mysql_backup/mysql_full_backup_$(date +%Y%m%d_%H%M%S).sql

  • 生产级优化全库备份(InnoDB 引擎无锁,推荐)

    mysqldump -u backup_user -p
    --all-databases
    --single-transaction
    --routines --triggers --events
    --master-data=2
    --quick
    --default-character-set=utf8mb4 \

    /data/mysql_backup/mysql_full_backup_$(date +%Y%m%d_%H%M%S).sql

(2)单个指定数据库备份...

mysql在use下的local中

已完成思考

OpenEuler 系统 MySQL(/usr/local 安装版)备份与恢复超详细教程

本教程针对手动编译安装或解压安装在 /usr/local/mysql 目录下 的 MySQL 5.7/8.0 版本适配,所有路径、命令均已调整为 /usr/local 环境,覆盖逻辑备份、物理热备、增量备份与时间点恢复全场景。


一、前置环境准备与基础配置

1. 环境说明与前提

  • 系统:OpenEuler LTS 系列版本
  • 数据库:MySQL 5.7/8.0(安装路径:/usr/local/mysql
  • 权限:所有操作需使用 root 用户或具备 sudo 权限的普通用户
  • 前提:MySQL 服务已正常安装并运行

2. MySQL 服务状态检查

复制代码
# 方式1:通过自定义启动脚本检查(若使用mysql.server)
/usr/local/mysql/support-files/mysql.server status

# 方式2:通过进程检查
ps -ef | grep mysqld

# 验证MySQL登录可用性(使用绝对路径)
/usr/local/mysql/bin/mysql -u root -p -e "SELECT VERSION();"

3. 专用备份用户创建与权限配置

  1. 登录 MySQL 命令行

    /usr/local/mysql/bin/mysql -u root -p

  2. 创建备份用户并授权

    -- 创建本地备份用户(替换为你的备份密码)
    CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'Backup@123456';
    -- 授予备份所需核心权限
    GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, SELECT, SHOW VIEW, EVENT, TRIGGER ON . TO 'backup_user'@'localhost';
    -- MySQL 8.0 热备需额外添加BACKUP_ADMIN权限
    GRANT BACKUP_ADMIN ON . TO 'backup_user'@'localhost';
    -- 刷新权限生效
    FLUSH PRIVILEGES;
    exit;

4. 核心前提:开启 binlog 二进制日志(增量恢复必备)

  1. 编辑 MySQL 配置文件(通常为 /usr/local/mysql/etc/my.cnf/usr/local/my.cnf,若不存在则创建)

    vim /usr/local/mysql/etc/my.cnf

  2. [mysqld]段落中添加以下配置

    [mysqld]

    安装基础目录

    basedir = /usr/local/mysql

    数据目录(关键!必须与实际安装路径一致)

    datadir = /usr/local/mysql/data

    服务器唯一ID

    server-id = 1

    开启binlog日志,指定日志文件前缀(存放在数据目录下)

    log_bin = mysql-bin

    binlog格式,推荐ROW行模式

    binlog_format = ROW

    binlog自动过期时间,单位天

    expire_logs_days = 7

    每次事务提交立即刷写binlog到磁盘

    sync_binlog = 1

    字符集配置

    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

  3. 重启 MySQL 服务使配置生效

    方式1:通过自定义启动脚本重启

    /usr/local/mysql/support-files/mysql.server restart

    方式2:若已配置systemctl服务(需提前手动配置)

    systemctl restart mysql

  4. 验证 binlog 是否开启成功

    /usr/local/mysql/bin/mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"

若返回结果中ValueON,则表示开启成功。


二、MySQL 备份全方案(/usr/local 路径适配版)

(一)逻辑备份 1:mysqldump 自带工具全详解

1. 核心说明
  • 命令路径:/usr/local/mysql/bin/mysqldump

  • 建议将 /usr/local/mysql/bin 加入环境变量(可选):

    复制代码
    echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
    source /etc/profile

    若未加入环境变量,以下所有命令需使用绝对路径

2. 全场景备份命令与示例

提前创建专用备份目录:

复制代码
mkdir -p /data/mysql_backup
chmod 700 /data/mysql_backup
(1)全库备份(生产级优化版)
复制代码
/usr/local/mysql/bin/mysqldump -u backup_user -p \
--all-databases \
--single-transaction \
--routines --triggers --events \
--master-data=2 \
--quick \
--default-character-set=utf8mb4 \
> /data/mysql_backup/mysql_full_backup_$(date +%Y%m%d_%H%M%S).sql
(2)单个指定数据库备份
复制代码
/usr/local/mysql/bin/mysqldump -u backup_user -p \
--single-transaction \
--routines --triggers --events \
--default-character-set=utf8mb4 \
test_db > /data/mysql_backup/test_db_backup_$(date +%Y%m%d).sql
(3)备份时直接压缩(大库必备)
复制代码
/usr/local/mysql/bin/mysqldump -u backup_user -p \
--all-databases --single-transaction --routines --triggers --events \
| gzip > /data/mysql_backup/mysql_full_backup_$(date +%Y%m%d).sql.gz
3. 增量备份核心:定期备份 binlog

binlog 默认存放在 /usr/local/mysql/data/ 目录下,文件名为 mysql-bin.00000*

复制代码
# 1. 刷新binlog,生成新的日志文件
/usr/local/mysql/bin/mysql -u backup_user -p -e "FLUSH LOGS;"
# 2. 备份binlog文件到备份目录
cp -p /usr/local/mysql/data/mysql-bin.00000* /data/mysql_backup/binlog/

(二)物理备份 1:冷备份(离线全量备份)

1. 备份操作步骤
  1. 停止 MySQL 服务

    /usr/local/mysql/support-files/mysql.server stop

  2. 直接拷贝整个数据目录(必须保留文件权限与属性)

    cp -rp /usr/local/mysql/data /data/mysql_backup/mysql_cold_backup_$(date +%Y%m%d)

  3. 启动 MySQL 服务恢复业务

    /usr/local/mysql/support-files/mysql.server start


(三)物理备份 2:Percona XtraBackup 热备份(生产级首选)

1. 安装说明

安装步骤与之前一致,但备份时需显式指定 MySQL 的 datadir 和 basedir

2. 全量热备份操作
复制代码
xtrabackup --user=backup_user --password='Backup@123456' \
--backup \
--target-dir=/data/mysql_backup/xtrabackup_full/full_$(date +%Y%m%d) \
--parallel=4 \
--datadir=/usr/local/mysql/data \
--basedir=/usr/local/mysql

三、MySQL 数据恢复全方案(/usr/local 路径适配版)

(一)mysqldump 逻辑备份恢复

1. 全库备份文件恢复
复制代码
# 普通sql文件恢复
/usr/local/mysql/bin/mysql -u root -p < /data/mysql_backup/mysql_full_backup_20260330.sql

# 压缩gz备份文件直接恢复
gunzip < /data/mysql_backup/mysql_full_backup_20260330.sql.gz | /usr/local/mysql/bin/mysql -u root -p
2. source 命令交互式恢复(大文件推荐)
  1. 登录 MySQL 命令行

    /usr/local/mysql/bin/mysql -u root -p

  2. 执行恢复操

    -- 单库/单表恢复:先切换到目标数据库
    use test_db;
    -- 执行source命令,必须使用备份文件的绝对路径
    source /data/mysql_backup/test_db_backup.sql;


(二)binlog 增量备份恢复

1. 核心说明
  • mysqlbinlog 命令路径:/usr/local/mysql/bin/mysqlbinlog
  • binlog 文件路径:/usr/local/mysql/data/mysql-bin.00000*
2. 按时间点恢复(误删数据急救)
复制代码
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 /usr/local/mysql/data/mysql-bin.000004 \
--stop-datetime="2026-03-30 10:29:59" \
| /usr/local/mysql/bin/mysql -u root -p

(三)冷备份文件恢复步骤

  1. 停止 MySQL 服务

    /usr/local/mysql/support-files/mysql.server stop

  2. 备份当前数据目录(防止恢复失败)

    mv /usr/local/mysql/data /usr/local/mysql/data_bak_$(date +%Y%m%d)

  3. 将冷备份的文件拷贝回数据目录

    cp -rp /data/mysql_backup/mysql_cold_backup_20260330/data /usr/local/mysql/

  4. 修正数据目录权限(关键步骤)

    chown -R mysql:mysql /usr/local/mysql/data
    chmod -R 750 /usr/local/mysql/data

  5. 启动 MySQL 服务

    /usr/local/mysql/support-files/mysql.server start


(四)XtraBackup 备份文件恢复步骤

1. 全量备份恢复
  1. 停止 MySQL 服务

    /usr/local/mysql/support-files/mysql.server stop

  2. 备份当前数据目录

    mv /usr/local/mysql/data /usr/local/mysql/data_bak_$(date +%Y%m%d)
    mkdir -p /usr/local/mysql/data

  3. 准备备份文件

    xtrabackup --prepare --target-dir=/data/mysql_backup/xtrabackup_full/full_20260330

  4. 将备份文件拷贝回 MySQL 数据目录

    xtrabackup --copy-back
    --target-dir=/data/mysql_backup/xtrabackup_full/full_20260330
    --datadir=/usr/local/mysql/data

  5. 修正目录权限并启动服务

    chown -R mysql:mysql /usr/local/mysql/data
    /usr/local/mysql/support-files/mysql.server start


四、生产级自动化备份方案(/usr/local 路径适配)

1. 自动化备份脚本编写

复制代码
vim /data/mysql_backup/mysql_auto_backup.sh

脚本内容(关键路径已适配):

复制代码
#!/bin/bash
# ==================== 配置项开始 ====================
# MySQL安装路径
MYSQL_BASE="/usr/local/mysql"
# MySQL备份用户信息
MYSQL_USER="backup_user"
MYSQL_PASSWORD="Backup@123456"
# 备份目录
BACKUP_DIR="/data/mysql_backup/daily"
# 备份文件保留天数
RETENTION_DAYS=7
# 日期格式
DATE=$(date +%Y%m%d_%H%M%S)
# 日志文件路径
LOG_FILE="${BACKUP_DIR}/backup_log_${DATE}.log"
# ==================== 配置项结束 ====================

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 日志输出函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

log "==================== 备份开始 ===================="

# 执行mysqldump全量备份并压缩(使用绝对路径)
${MYSQL_BASE}/bin/mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
--all-databases \
--single-transaction \
--routines --triggers --events \
--master-data=2 \
--quick \
--default-character-set=utf8mb4 \
| gzip > ${BACKUP_DIR}/mysql_full_backup_${DATE}.sql.gz

# 判断备份是否成功
if [ $? -eq 0 ]; then
    log "备份成功,备份文件:${BACKUP_DIR}/mysql_full_backup_${DATE}.sql.gz"
    BACKUP_SIZE=$(du -h ${BACKUP_DIR}/mysql_full_backup_${DATE}.sql.gz | awk '{print $1}')
    log "备份文件大小:${BACKUP_SIZE}"
else
    log "备份失败!"
    exit 1
fi

# 清理超过保留天数的备份文件
log "开始清理${RETENTION_DAYS}天前的备份文件"
find ${BACKUP_DIR} -name "mysql_full_backup_*.sql.gz" -mtime +${RETENTION_DAYS} -delete
find ${BACKUP_DIR} -name "backup_log_*.log" -mtime +${RETENTION_DAYS} -delete
log "过期文件清理完成"

log "==================== 备份结束 ===================="

2. 脚本权限配置与测试

复制代码
chmod 700 /data/mysql_backup/mysql_auto_backup.sh
bash /data/mysql_backup/mysql_auto_backup.sh

五、关键路径总结(/usr/local 安装版)

表格

项目 路径
MySQL 安装目录 /usr/local/mysql
数据目录 /usr/local/mysql/data
配置文件 /usr/local/mysql/etc/my.cnf/usr/local/my.cnf
命令工具目录 /usr/local/mysql/bin
binlog 日志目录 /usr/local/mysql/data
启动脚本 /usr/local/mysql/support-files/mysql.server
相关推荐
Carino_U2 小时前
全面理解mysql架构
mysql·adb·架构
笑梦无境2 小时前
mysql基础篇一(多年前整理)
数据库·mysql
数据库幼崽2 小时前
proxy SQL Bootstrap模式
mysql
深蓝轨迹2 小时前
解决Redis排序后MySQL查询乱序问题:从原因到落地(通用版)
数据库·redis·笔记·mysql·bug
zhangren024682 小时前
Laravel5.x版本特性全解析
android·vue.js·spring boot·mysql
笑梦无境3 小时前
mysql基础篇二(多年前整理)
数据库·mysql
cqsztech3 小时前
基于ORACLE LINUX 10.1 MYSQL 8.4 源码安装
linux·mysql·oracle
乐之者v3 小时前
mysql 的查询条件放在 join on 和 Where 的区别:
mysql
卤炖阑尾炎3 小时前
MySQL 全量、增量备份与恢复实战指南
mysql·adb