有一个 mariaDB 实例已经在运行并且在许多表中都有数据。让我称呼这个旧数据库。比如说,结构(表及其字段)没有经过深思熟虑,因此导致多个记录中的数据重复,并且许多记录中的大多数列都是空的。此外,列名没有提供任何信息,例如 col1、col2 和 col3,而不是名称、地点和地址。由于 mariaDB 实例处于活跃使用状态,因此任何重组都将涉及更改使用它的其他应用程序。因此,我们希望将其复制到位于不同位置的不同实例中的不同结构,让我称之为新数据库。这样,之前部署的所有应用程序仍然可以运行,但可以使用更好的结构化副本。
当数据添加到旧数据库时,它会实时复制到新结构中。例如,假设旧数据库有一个表员工,例如
create table employee (
g1 int,
g2 varchar(255),
g3 varchar(255),
g4 varchar(255),
g5 date
);
在新数据库中,假设相同的数据通过拆分为两个表来构建:
create table employee_table (
id int primary key,
first_name varchar(255),
last_name varchar(255),
date_of_birth date
);
create table address_table (
id int,
address varchar(255),
foreign key (id) references employee_table(id)
);
在这种情况下,假设我们希望将旧数据库中的员工字段映射到新数据库中的字段:
- 雇员.g1 -> 雇员表.id, 地址表.id
- 雇员.g2 -> 雇员表.first_name
- 雇员.g3 -> 雇员表.姓氏
- 雇员.g4 -> 地址表.地址
- 雇员.g5 -> 雇员表.出生日期
是否可以使用 mariadb 或 postgresql 支持的任何可用复制方法来完成此任务?
我知道可以复制到与旧数据库相同的结构,但我无法找到有关复制到不同结构的任何内容。我能想到的唯一方法是编写一个 json 配置,将新数据库中的每个字段映射到旧数据库以及必要的信息(例如类型),以便在必要时执行类型转换。例如,Python 脚本可以使用它作为查找来从旧数据库填充新数据库,并且该脚本可以定期运行作业。配置还应该提及标记或处理冲突的方法,因为旧数据库的结构不好,所以它们是预期的。例如,同一员工在旧数据库中可以有两个不同的 data_of_birth,这应该在复制时处理或标记。
插入时还可以为每个表设置触发器,因此插入旧数据库的数据会反映在新数据库中的不同结构中。数据始终仅通过已部署的应用程序插入旧数据库中。然后,可以使用标准方法将新数据库复制到其他位置。但我觉得这不太好,因为编辑 json 配置比转到每个表并在需要更改时修改触发器更容易。
希望能提供有关执行此类复制的更好方法的建议以及完成此操作的标准方法的指针。
对于简单的名称更改,定义
VIEWs
可能是“最佳”解决方案。每一个都
VIEW
可以是现有层之上的薄层。这仍然需要从表名称更改为视图名称。复制,即使是“基于行”,也可能无法忽略列名。
部分问题是必须与架构“同时”更改应用程序。但这可能是一个解决方法:
请注意,此 3 步流程可以处理多种类型的更改,而不仅仅是名称更改。
pt-online-schema-change
可能是进行 ALTER 的最佳方式;它运行 ALTER 时停机时间基本上为零。