数据迁移
12002数据迁移的意义和必要性
数据迁移是将数据从一个存储系统、数据库或应用迁移到另一个的过程。其意义和必要性主要体现在以下几个方面:
- 平台迁移: 当业务需求、技术栈或基础架构发生变化时,需要将数据从一个平台迁移到另一个平台,以确保系统的顺利过渡。
- 版本升级: 在升级数据库引擎或应用版本时,可能需要进行数据迁移以适应新的数据结构或规范。
- 合并与拆分: 公司合并、部门拆分或业务整合时,需要将相关数据进行迁移,以保持数据一致性。
- 数据清理: 在清理和优化数据时,可能需要将数据从一个表或数据库移动到另一个表或数据库,以便更好地管理和维护数据。
- 遗留系统迁移: 当从遗留系统迁移到现代系统时,需要将历史数据迁移到新系统中,以保留业务的完整性和可追溯性。
1、方案一: Navicat 复制表
Navicat是一款数据库管理工具,可以通过其提供的复制表功能将数据从一个表复制到另一个表。这种方案适用于简单的数据迁移操作,特别是在数据量不大的情况下。例如,将旧的users_old表的数据复制到新的users_new表:
CREATE TABLE users_new AS SELECT * FROM users_old;
2、方案二: 使用 MySQL View 将旧表迁移到新表
使用 MySQL View 可以创建虚拟表,其数据来源可以是一个或多个表。这种方案适用于需要对源表进行逻辑转换或过滤的情况。
- 第一步: 使用mysql view将新表的数据准备好
DROP VIEW IF EXISTS `view01_migrate_student_new`;
CREATE VIEW view01_migrate_student_new AS
SELECT
`student`.`id` AS `id`,
`student`.`studentId` AS `studentId`,
`student`.`name` AS `studentName`,
`student`.`gender` AS `studentGender`,
`student`.`dateOfBirth` AS `dateOfBirth`,
`student`.`classId` AS `classId`,
`student`.`level` AS `level`,
`student`.`bodyHeight` AS `bodyHeight`,
`student`.`studentStatus` AS `studentStatus`,
`student`.`remarks` AS `remarks`,
`student`.`operation` AS `operation`,
`student`.`operationByUserId` AS `operationByUserId`,
`student`.`operationByUser` AS `operationByUser`,
`student`.`operationAt` AS `operationAt`
FROM
`student`;
- 第二步: 将
view01_migrate_student_new
写入到student_new
表-- 多次执行需要删除上一次的数据
INSERT INTO student_new SELECT * FROM view01_migrate_student_new;
3、方案三: 使用 JavaScript 脚本进行数据处理替换
JavaScript脚本可以在脚本语言的环境中对数据进行处理和替换。这种方案适用于复杂的数据迁移需求,例如需要对数据进行转换、清理或合并的情况。例如,使用Node.js脚本连接两个数据库,将products_old表中的过期产品迁移到products_archive表:
const oldProducts = connectToOldDatabase().query('SELECT * FROM products_old WHERE expiration_date < NOW()');
connectToNewDatabase().query('INSERT INTO products_archive SELECT * FROM ?', [oldProducts]);
使用脚本是一种比较笨的方法,但是也是一种兼容性最高的方法,可以方便的处理任何数据结构差异带来的数据问题
const knex = require('knex')({
client: 'mysql',
connection: {
host: 'source_database_host',
user: 'source_database_username',
password: 'source_database_password',
database: 'source_database_name'
}
});
async function migrateData() {
const oldList = await knex('student').select();
const newList = oldList.map(old => {
const { name: studentName, gender: studentGender, ...other } = old;
return { studentName, studentGender, ...other };
})
// 注意: 多次执行需要删除上一次的数据
await targetDb('student_new').insert(newList);
}
选择合适的数据迁移方案取决于具体的业务需求、数据结构和迁移复杂度。在进行数据迁移之前,建议做好充分的计划和备份,以确保数据的安全性和完整性。