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';

主从同步 然后从变主

相关推荐
阿桨3 小时前
【Prometheus-MySQL Exporter安装配置指南,开机自启】
数据库·mysql
红烧柯基3 小时前
解决redis序列号和反序列化问题
java·数据库·redis
小黄人20254 小时前
【KWDB 创作者计划】一款面向 AIoT 的多模数据库实战体验
数据库·云计算·kwdb
wangzhongyudie4 小时前
SQL实战:03之SQL中的递归查询
数据库·hive·sql
API_technology4 小时前
《淘宝 API 数据湖构建:实时商品详情入湖 + Apache Kafka 流式处理指南》
数据库·分布式·数据挖掘·kafka·apache
DDDiccc4 小时前
黑马Redis(四)
数据库·redis·mybatis
麓殇⊙4 小时前
MySQL--数据引擎详解
数据库·mysql
rainFFrain4 小时前
MySQL的数据类型
数据库·mysql
拐锅4 小时前
CentOS一键安装MySQL5.7(源码安装)
mysql