linux 中,mysql 数据整体迁移

577 阅读4分钟

备份MySQL数据

mysqldump

在开始任何迁移过程前,确保你有一个完整的数据库备份。这可以通过mysqldump工具来完成。

mysqldump 是 MySQL 自带的一个命令行实用程序,用于导出 MySQL 数据库的内容到文本文件中。它不需要单独下载,因为它是 MySQL 安装包的一部分。当你在系统上安装了 MySQL 服务器或 MySQL 客户端工具时,mysqldump 通常会被自动包含在内。

要验证 mysqldump 是否已经安装在你的 CentOS 系统上,可以在终端中输入以下命令:

mysqldump --version

如果 mysqldump 已经安装,这条命令会返回版本信息,类似于:

mysqldump  Ver 8.0.23-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

如果 MySQL 已经安装在你的系统上,但你遇到 mysqldump: command not found 错误,这通常意味着 mysqldump 命令不在系统的 PATH 中,或者 MySQL 客户端工具没有正确安装。


### 1. 检查 `mysqldump` 的位置

即使 `mysqldump` 已经安装,它可能没有被添加到系统的 PATH 中。你可以通过以下命令来查找 `mysqldump` 的实际位置:

```bash
which mysqldump

如果 which 命令没有返回任何结果,说明 mysqldump 不在 PATH 中。你可以手动查找 mysqldump 的位置:

find / -name mysqldump 2>/dev/null

这会搜索整个文件系统来找到 mysqldump 的位置。

备份MySQL数据

打开终端并以root用户或具有sudo权限的用户登录。 运行以下命令来备份所有数据库(回车回输入你的MySQL root密码), mysqldump 命令在成功执行后会返回一个退出状态码 0。你可以通过检查退出状态码来确认命令是否成功执行:

# 使用 `--verbose` 选项以获取更多的调试信息
sudo mysqldump --all-databases -u root -p --verbose > /path/to/backup/all_databases.sql

#查看状态码
echo $?

查看数据是否成功备份:
使用 lessmore 命令可以在终端中逐页查看文件内容。

less /path/to/backup/all_databases.sql

查看数据表文件所在的位置

在 CentOS 上,默认情况下,MySQL 的主要配置文件是 /etc/my.cnf 或者 /etc/mysql/my.cnf。你可以在这个文件中查找 datadir 选项来确定数据文件存放的位置。

以下是具体步骤:

  1. 打开配置文件: 通常情况下,文件位于 /etc/my.cnf/etc/mysql/my.cnf

    sudo vim /etc/my.cnf
    
  2. 查找 datadir 设置: 在配置文件中搜索 [mysqld] 部分,然后查找 datadir 参数。这个参数指定了 MySQL 数据文件的根目录。

    例如:

    [mysqld]
    ...
    datadir=/usr/local/mysql/data
    ...
    

    在这个例子中,MySQL 的数据文件存储在 /usr/local/mysql/data 目录下。

  3. 验证数据目录: 如果你想确认 MySQL 实际上使用的 datadir,可以登录到 MySQL 控制台并执行 SQL 查询来获取这个信息。

    mysql -u root -p
    

    然后在 MySQL 提示符下输入:

    SHOW VARIABLES LIKE 'datadir';
    

    这条命令会显示 MySQL 当前使用的 datadir 路径。

如果你没有看到 datadir 的明确设置,那么 MySQL 可能使用的是默认值。对于大多数 Linux 发行版,包括 CentOS,默认的数据目录通常是 /var/lib/mysql。如果你对配置文件进行了自定义设置或者使用了其他非标准位置,那么 datadir 的值可能会不同。确保你检查的是正确的配置文件,并且没有其他配置文件覆盖了 datadir 的设置。有时候,MySQL 也会读取多个配置文件,所以你可能需要检查所有相关的配置文件。

停止MySQL服务

在进行数据迁移之前,必须先停止MySQL服务,以防止在复制过程中出现数据损坏。

sudo systemctl stop mysqld

将数据迁移到新盘

  1. 假设新盘已经安装好并且挂载到了 /mnt/newdisk(如果还没有挂载,请先挂载新盘)。

  2. 创建一个新的MySQL数据目录,并设置正确的权限:

    sudo mkdir -p /mnt/newdisk/mysql/data
    
    # 递归地改变 `/mnt/newdisk/mysql/data` 目录及其所有子目录和文件的所有者和组
    # MySQL 服务通常以 `mysql` 用户和 `mysql` 组的身份运行
    sudo chown -R mysql:mysql /mnt/newdisk/mysql/data
    
  3. 复制旧的数据到新的数据目录:

    # `-a` (archive mode): 归档模式, `-v` (verbose): 详细模式
    sudo rsync -av /usr/local/mysql/data /mnt/newdisk/mysql/data
    

移动 MySQL 程序文件

将 MySQL 服务器及其数据从一个磁盘移动到另一个磁盘,不仅仅是移动数据目录,还需要移动 MySQL 程序文件,并确保新的安装能够正常工作。以下是详细的步骤:

  1. 复制 MySQL 程序文件: 找到 MySQL 程序文件的安装位置。通常,MySQL 程序文件安装在 /usr/bin/usr/lib64/mysql(或其他类似的目录)。

    你可以使用以下命令来查找 MySQL 程序文件的位置:

    which mysqld
    

    或者

    whereis mysqld
    

    通常,MySQL 程序文件的目录结构如下:

    • /usr/bin/ (包含 mysqld, mysql, mysqldump 等)
    • /usr/lib64/mysql/ (包含库文件)
    • /usr/share/mysql/ (包含配置文件和文档)

    将这些目录复制到新磁盘。假设新磁盘的挂载点为 /mnt/software

    sudo rsync -av /usr/bin/ /mnt/newdisk/usr/bin/
    sudo rsync -av /usr/lib64/mysql/ /mnt/newdisk/usr/lib64/mysql/
    sudo rsync -av /usr/share/mysql/ /mnt/newdisk/usr/share/mysql/
    
  2. 更改程序文件权限: 确保新程序文件的权限正确。

    sudo chown -R root:root /mnt/newdisk/usr/bin/
    sudo chown -R root:root /mnt/newdisk/lib64/mysql/
    sudo chown -R root:root /mnt/newdisk/usr/share/mysql/
    

更新配置文件

  1. 修改 MySQL 配置文件: 编辑 MySQL 配置文件(通常是 /etc/my.cnf/etc/mysql/my.cnf),更改 datadir 参数指向新的数据目录。

    sudo nano /etc/my.cnf
    

    找到 [mysqld] 部分,并修改 datadir 参数:

    [mysqld]
    datadir=/mnt/software/mysqlData
    
  2. 更新系统路径: 确保系统路径指向新的 MySQL 程序文件。编辑 /etc/profile/etc/bashrc,添加以下内容:

    export PATH=/mnt/newdisk/usr/bin:$PATH
    export LD_LIBRARY_PATH=/mnt/newdisk/usr/lib64/mysql:$LD_LIBRARY_PATH
    

    使更改生效:

    source /etc/profile
    

启动 MySQL 服务

  1. 重新配置 systemd 服务: 如果你使用的是 systemd 来管理 MySQL 服务,你需要更新 systemd 服务文件。

编辑 MySQL 的 systemd 服务文件(通常是 /usr/lib/systemd/system/mysqld.service/lib/systemd/system/mysqld.service):

sudo nano /usr/lib/systemd/system/mysqld.service

修改 ExecStartExecTest 行,指向新的 MySQL 程序文件路径:

[Service]
ExecStart=/mnt/newdisk/usr/bin/mysqld --defaults-file=/etc/my.cnf --datadir=/mnt/newdisk/mysql
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
  1. 重新加载 systemd 配置: 重新加载 systemd 配置以应用更改。

    sudo systemctl daemon-reload
    
  2. 启动 MySQL 服务: 使用 systemd 启动 MySQL 服务。

    sudo systemctl start mysqld
    
  3. 设置开机自启动: 确保 MySQL 服务在系统启动时自动启动。

    sudo systemctl enable mysqld
    

重启MySQL服务

最后,重启MySQL服务来应用更改:

sudo systemctl start mysqld

检查MySQL是否正常运行:

sudo systemctl status mysqld

现在,你的MySQL数据应该已经被成功迁移到了新的磁盘上。记得测试一下你的应用程序,确保它们可以正常访问数据库。

数据恢复

如果迁移失败,需要把备份数据恢复的时候,可以如下操作: mysqldump 生成的备份文件实际上是一个 SQL 脚本,包含了创建数据库结构(表、视图等)和插入数据的 SQL 语句。你可以使用多种方法来查看和恢复这些备份文件。

查看 mysqldump 备份文件

  1. 使用文本编辑器: 你可以使用任何文本编辑器来打开和查看 mysqldump 生成的 SQL 文件。这可以帮助你了解备份文件的内容,但请注意,如果文件非常大,打开可能会比较慢。

    vim /path/to/backup/all_databases.sql
    
  2. 使用 lessmore 命令: 如果文件很大,使用 lessmore 命令可以在终端中逐页查看文件内容。

    less /path/to/backup/all_databases.sql
    

恢复 mysqldump 备份文件

恢复 mysqldump 备份文件通常涉及将 SQL 文件中的内容导入到 MySQL 数据库中。以下是几种常见的方法:

1. 使用 mysql 命令行工具

你可以使用 mysql 命令行工具来导入 SQL 文件。假设你的备份文件名为 all_databases.sql,你可以按如下方式导入:

mysql -u root -p < /path/to/backup/all_databases.sql

这里:

  • -u root 指定使用 root 用户。
  • -p 提示你输入密码。
  • < 是重定向符号,用于将 SQL 文件的内容传递给 mysql 命令。

如果你只想恢复某个特定的数据库,可以指定数据库名:

mysql -u root -p your_database_name < /path/to/backup/your_database.sql

注意事项

  • 权限: 确保你有足够的权限来执行导入操作。通常需要 CREATE, DROP, INSERT, UPDATE, DELETE 等权限。
  • 数据库存在性: 如果目标数据库已经存在,导入操作可能会覆盖现有数据。你可以先删除目标数据库或使用 --force 选项来强制导入。
  • 字符集: 确保导入时使用的字符集与备份时使用的字符集一致,以避免乱码问题。
  • 数据完整性: 在生产环境中,建议在导入前进行彻底的测试,以确保数据完整性和一致性。

通过以上方法,你可以轻松查看和恢复 mysqldump 生成的备份文件。