MYSQL 表对表快速迁移-直接拷贝表空间文件.ibd进行迁移

server/2024/10/20 14:08:20/

数据无价,操作前,建议先备份

前提条件

  1. 表结构一致

    • 数据库和目标数据库中的表结构必须完全相同。这包括表的列定义、索引、约束等。
  2. 表使用 InnoDB 存储引擎

    • 这种迁移方法仅适用于使用 InnoDB 存储引擎的表,因为 .ibd 文件是 InnoDB 表的表空间文件。
  3. 数据库版本兼容

    • 数据库和目标数据库的 MySQL 或 MariaDB 版本应该兼容。理想情况下,两个数据库的版本应该相同或非常接近,以避免潜在的兼容性问题。
  4. 表未被使用

    • 在执行 FLUSH TABLES ... FOR EXPORTDISCARD TABLESPACE 操作时,确保表未被其他事务或会话使用。
  5. 文件系统权限

    • 确保你有足够的文件系统权限来复制和修改 .ibd.cfg 文件。通常,这需要 root 权限或数据库服务用户(如 mysql 用户)的权限。
  6. 数据库服务用户权限

  7. 关闭外键检查

    • 如果表中有外键约束,可能需要在导入表空间之前临时禁用外键检查。

注意事项

  1. 备份数据

    • 在进行任何操作之前,务必备份源数据库和目标数据库的数据,以防止数据丢失。
  2. 一致性检查

    • 在导入表空间后,检查表的数据一致性和完整性,确保数据没有损坏。
  3. 表定义文件

    • 确保在导出表空间时生成了表定义文件(.cfg 文件),并在导入时一并复制到目标数据库
  4. 数据库日志

    • 在操作过程中,检查数据库日志文件以获取更多信息和错误提示。
  5. 禁用外键检查(如果有外键):

    • 在导入表空间之前,可以临时禁用外键检查,以避免外键约束问题。
    SET foreign_key_checks = 0;
    ALTER TABLE table_name IMPORT TABLESPACE;
    SET foreign_key_checks = 1;

迁移步骤

  1. 在源数据库

    -- 在源数据库中执行 FLUSH TABLES table_name FOR EXPORT 命令。这将确保表的所有更改都已写入磁盘,并生成一个表定义文件(.cfg 文件)
    FLUSH TABLES table_name FOR EXPORT;
  2. 复制文件

    -- 复制表的表空间文件(.ibd 文件)和表定义文件(.cfg 文件)到目标数据库服务器
    -- 如果没有账号密码的情况下,可以借助nginx+wget进行传输文件scp /path/to/mysql/data/database_name/table_name.ibd user@target_server:/path/to/target/mysql/data/database_name/
    scp /path/to/mysql/data/database_name/table_name.cfg user@target_server:/path/to/target/mysql/data/database_name/
  3. 在目标数据库

    -- 在目标数据库中创建一个与源表结构相同的表。直接使用源数据库表结构导出后,再目标数据库创建表
    CREATE TABLE table_name (...);
    -- 执行 ALTER TABLE table_name DISCARD TABLESPACE 命令。这将删除目标表的现有表空间文件。
    ALTER TABLE table_name DISCARD TABLESPACE;
  4. 复制文件到目标数据库目录

    -- 将源数据库中的表空间文件(.ibd 文件)和表定义文件(.cfg 文件)复制到目标数据库的表空间目录中
    cp /path/to/source/table_name.ibd /path/to/target/mysql/data/database_name/
    cp /path/to/source/table_name.cfg /path/to/target/mysql/data/database_name/-- 根据目标数据库文件的权限进行对应的权限修改
    chown -R polkitd:input /path/to/target/mysql/data/database_name/table_name.ibd
    chown mysql:mysql /path/to/target/mysql/data/database_name/table_name.ibd
    chown mysql:mysql /path/to/target/mysql/data/database_name/table_name.cfg
  5. 在目标数据库中导入表空间

    -- 执行 ALTER TABLE table_name IMPORT TABLESPACE 命令。这将导入表空间文件到目标表中。
    ALTER TABLE table_name IMPORT TABLESPACE;
  6. 检查

    • 结束后,检查源数据库表和目标表数据是否一致 可使用查询语句count(*)或者其他比对方式
    • 删除源数据库和目标数据库的cfg文件

后记

  • docker 部署的mysql 可以使用 docker inspect 容器id 查询容器信息,找到docker的位置

http://www.ppmy.cn/server/133360.html

相关文章

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义:**将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 2.结构: 抽象化角色 :定义抽象类,并包含一个对实现化…

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…

如何使用Python对Excel、CSV文件完成数据清洗与预处理?

在数据分析和机器学习项目中,数据清洗与预处理是不可或缺的重要环节。 现实世界中的数据往往是不完整、不一致且含有噪声的,这些问题会严重影响数据分析的质量和机器学习模型的性能。 Python作为一门强大的编程语言,提供了多种库和工具来帮…

AWS Aurora 实例更换实战:最小化业务影响的升级策略

在本文中,我们将详细介绍如何在生产环境中安全地更换 AWS Aurora 实例,包括主写实例和只读实例的更换过程。我们的目标是将影响降到最低,同时确保系统的稳定性和性能。 背景 随着业务的增长,我们需要升级现有的 Aurora 实例以提供更好的性能和更大的容量。本次更换涉及主…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

TiDB 关联子查询及半连接的优化实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/e9563a23 导读 TiDB 针对子查询语句会执行多种 子查询相关的优化 &#xff0c;以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询&#xff0c;TiDB 优化器默认包…

python 爬虫模拟登录

在使用 Python 编写爬虫时&#xff0c;模拟登录是一个非常常见的需求&#xff0c;尤其是当你需要爬取需要身份验证的数据时。模拟登录通常需要以下步骤&#xff1a; 分析登录页面&#xff1a;确定提交登录请求的 URL 和相关参数。发送登录请求&#xff1a;模拟用户发送登录表单…

UE4 材质学习笔记09(雨水水坑着色器/完整雨水着色器)

一.雨水水坑着色器 要用到这样一个噪声贴图&#xff0c;我们要做的就是&#xff0c;做出水坑并让水坑在这种浑浊的噪点中产生&#xff0c;因此水坑将从最暗的斑点生长&#xff0c;然后随着它继续占据越来越亮的像素而生长 现在水坑将从上到下投射到世界空间中&#xff0c;所以…