数据迁移

12002

数据迁移的意义和必要性

数据迁移是将数据从一个存储系统、数据库或应用迁移到另一个的过程。其意义和必要性主要体现在以下几个方面:

  • 平台迁移: 当业务需求、技术栈或基础架构发生变化时,需要将数据从一个平台迁移到另一个平台,以确保系统的顺利过渡。
  • 版本升级: 在升级数据库引擎或应用版本时,可能需要进行数据迁移以适应新的数据结构或规范。
  • 合并与拆分: 公司合并、部门拆分或业务整合时,需要将相关数据进行迁移,以保持数据一致性。
  • 数据清理: 在清理和优化数据时,可能需要将数据从一个表或数据库移动到另一个表或数据库,以便更好地管理和维护数据。
  • 遗留系统迁移: 当从遗留系统迁移到现代系统时,需要将历史数据迁移到新系统中,以保留业务的完整性和可追溯性。

1、方案一: Navicat 复制表

Navicat是一款数据库管理工具,可以通过其提供的复制表功能将数据从一个表复制到另一个表。这种方案适用于简单的数据迁移操作,特别是在数据量不大的情况下。例如,将旧的users_old表的数据复制到新的users_new表:

  1. CREATE TABLE users_new AS SELECT * FROM users_old;

2、方案二: 使用 MySQL View 将旧表迁移到新表

使用 MySQL View 可以创建虚拟表,其数据来源可以是一个或多个表。这种方案适用于需要对源表进行逻辑转换或过滤的情况。

  • 第一步: 使用mysql view将新表的数据准备好
    1. DROP VIEW IF EXISTS `view01_migrate_student_new`;
    2. CREATE VIEW view01_migrate_student_new AS
    3. SELECT
    4. `student`.`id` AS `id`,
    5. `student`.`studentId` AS `studentId`,
    6. `student`.`name` AS `studentName`,
    7. `student`.`gender` AS `studentGender`,
    8. `student`.`dateOfBirth` AS `dateOfBirth`,
    9. `student`.`classId` AS `classId`,
    10. `student`.`level` AS `level`,
    11. `student`.`bodyHeight` AS `bodyHeight`,
    12. `student`.`studentStatus` AS `studentStatus`,
    13. `student`.`remarks` AS `remarks`,
    14. `student`.`operation` AS `operation`,
    15. `student`.`operationByUserId` AS `operationByUserId`,
    16. `student`.`operationByUser` AS `operationByUser`,
    17. `student`.`operationAt` AS `operationAt`
    18. FROM
    19. `student`;
  • 第二步: 将view01_migrate_student_new 写入到student_new
    1. -- 多次执行需要删除上一次的数据
    2. INSERT INTO student_new SELECT * FROM view01_migrate_student_new;

3、方案三: 使用 JavaScript 脚本进行数据处理替换

JavaScript脚本可以在脚本语言的环境中对数据进行处理和替换。这种方案适用于复杂的数据迁移需求,例如需要对数据进行转换、清理或合并的情况。例如,使用Node.js脚本连接两个数据库,将products_old表中的过期产品迁移到products_archive表:

  1. const oldProducts = connectToOldDatabase().query('SELECT * FROM products_old WHERE expiration_date < NOW()');
  2. connectToNewDatabase().query('INSERT INTO products_archive SELECT * FROM ?', [oldProducts]);

使用脚本是一种比较笨的方法,但是也是一种兼容性最高的方法,可以方便的处理任何数据结构差异带来的数据问题

  1. const knex = require('knex')({
  2. client: 'mysql',
  3. connection: {
  4. host: 'source_database_host',
  5. user: 'source_database_username',
  6. password: 'source_database_password',
  7. database: 'source_database_name'
  8. }
  9. });
  10. async function migrateData() {
  11. const oldList = await knex('student').select();
  12. const newList = oldList.map(old => {
  13. const { name: studentName, gender: studentGender, ...other } = old;
  14. return { studentName, studentGender, ...other };
  15. })
  16. // 注意: 多次执行需要删除上一次的数据
  17. await targetDb('student_new').insert(newList);
  18. }

选择合适的数据迁移方案取决于具体的业务需求、数据结构和迁移复杂度。在进行数据迁移之前,建议做好充分的计划和备份,以确保数据的安全性和完整性。