mysql大量数据迁移(内含mysql表空间的介绍)

要看量有多大、业务是否可以暂停迁移 等

这个过程可以用于数据备份、数据迁移、数据整合等多种场景

mysqldump

使用下面两行命令,将数据导出为一个sql,再导入到目标表里;

go 复制代码
# 导出
mysqldump -u root -p --no-create-info --skip-extended-insert -t partition_demo tb_user > tb_user_data.sql

# 导入
mysql -u root -p partition_demo < tb_user_data.sql

其中,

partition_demo:数据库名;

tb_user:表名;

tb_user_data.sql:导出的文件名,可以在前面加上文件路径,文件内容实际上就是insert语句;

root:数据库用户名;

直接insert into

如果表数据量不大,可以直接用下面这行SQL,将数据直接插入到另外一张表里。当然,下面SQL是全字段插入,如果需要做映射,可以选择某几个字段插入;

insert into tb_user select * from tb_user_source;

Canal

可以使用Canal,用代码的方式转移,这种方式的好处是灵活可控,数据量大的表也可以,另外可以实现在线转移,不影响线上业务。参考下面这两篇文章:

表空间直接迁移文件法

表空间(Tablespace)是用于管理和存储数据的一种逻辑概念。表空间主要用于 InnoDB 存储引擎,它允许多个表共享同一个物理文件,从而提高磁盘空间的利用率和管理效率。

表空间的概念

表空间:表空间是一个逻辑容器,用于存储一个或多个表的数据。每个表空间可以包含一个或多个数据文件(通常是 .ibd 文件)。

数据文件:每个数据文件是一个物理文件,存储在文件系统中。InnoDB 表的数据和索引信息都存储在这些数据文件中。

类型

MySQL 中主要有两种类型的表空间:

系统表空间(System Tablespace):

也称为 ibdata 文件。

默认情况下,所有表的数据和索引都存储在系统表空间中。

系统表空间通常包含多个文件,文件名默认为 ibdata1、ibdata2 等。

系统表空间还包含数据字典、事务日志、双写缓冲区(Doublewrite Buffer)等元数据信息。

独立表空间(File-Per-Table Tablespace):

每个表都有一个独立的数据文件,文件名与表名相同,扩展名为 .ibd。

独立表空间的好处是每个表的数据和索引都存储在一个单独的文件中,便于管理和备份。

启用独立表空间需要在 MySQL 配置文件中设置 innodb_file_per_table 参数为 ON。

配置参数

innodb_file_per_table:

控制是否启用独立表空间。

默认值为 ON(MySQL 5.6.6 及以后版本)。

如果设置为 OFF,所有表的数据和索引都将存储在系统表空间中。

innodb_data_file_path:

指定系统表空间的数据文件路径和大小。

例如:innodb_data_file_path=ibdata1:10M:autoextend

innodb_data_home_dir:

指定系统表空间数据文件的根目录。

例如:innodb_data_home_dir=/var/lib/mysql/

创建和管理表空间

创建表空间

CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB;

1

删除表空间

DROP TABLESPACE ts1;

1

查看表空间

SHOW TABLESPACE;

1

示例

假设我们有一个数据库 mydb,并且希望创建一个独立表空间的表 mytable。

启用独立表空间:

在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中添加或修改以下配置:

mysqld

innodb_file_per_table = ON

1

2

创建表:

CREATE TABLE mytable (

id INT AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(50),

age INT

) ENGINE=InnoDB;

1

2

3

4

5

查看表空间:

SHOW TABLESPACE;

1

注意事项

迁移表到独立表空间:

如果已经创建了表并且存储在系统表空间中,可以使用 ALTER TABLE 命令将其迁移到独立表空间:

ALTER TABLE mytable ENGINE=InnoDB;

1

回收表空间:

当删除表时,独立表空间的数据文件并不会自动删除。需要手动删除:

DROP TABLE mytable;

-- 手动删除 .ibd 文件

rm /path/to/mytable.ibd

1

2

3

性能影响:

独立表空间可以提高磁盘空间利用率和管理效率。

但过多的独立表空间文件可能会导致文件系统开销增加,特别是在有大量表的情况下。


复制代码
                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/a772304419/article/details/143696462

步骤

1.源实例上获取表的定义

show create table

2.目标实例上创建表,根据以上获取到的定义

create table t11 int)ENGINE=INNODB;

3.在目标实例丢弃刚刚创建的表的表空间

ALTER TABLE t1 DISCARD TABLESPACE;

4.源实例上运行 FLUSH TABLES...FOR EXPORT语句,使要导入的表进入静止状态,此时该表只允许只读事务

FLUSH TABLES tI FOR EXPORT;

5.将.ibd 文件和.cfg 元数据文件从源实例复制到目标实例。

scp /path/to/datadir/test/t1.{ibd,cfg} destination-server:/path/to/datadir/test6.在源实例上,使用 UNLOCK TABLES 释放由 FLUSH TABLES...FOR EXPORT 语句获取的锁

UNLOCK TABLES

7.在目标实例上,导入表空间

ALTER TABLE t1 IMPORT TABLESPACE:

使用SELECT INTO OUTFILE和LOAD DATA INFILE

这种方法适用于在服务器之间迁移数据,特别是当使用mysqldump不方便或者需要更高效迁移大量数据时。

导出数据:

SELECT * INTO OUTFILE '/path/to/local/table_data.csv'

FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'

FROM database_name.table_name;

导入数据:

LOAD DATA INFILE '/path/to/local/table_data.csv'

INTO TABLE new_database_name.table_name

FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

主从同步 然后从变主

相关推荐
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai1 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
Bruce_Liuxiaowei8 小时前
MySQL完整重置密码流程(针对 macOS)
mysql
麦麦大数据9 小时前
F003疫情传染病数据可视化vue+flask+mysql
mysql·flask·vue·大屏·传染病
薛晓刚9 小时前
当MySQL的int不够用了
数据库