В некоторых случаях мы должны переносить данные, например разбивать большие данные в одной таблице на несколько таблиц или синхронизировать производственные данные с локальными и т. Д. *
Вот мое решение:
продолжайте синхронизировать данные из исходной таблицы каждые 10 секунд (создайте задачу в crontab), и каждый раз будет не более 1 тыс. Элементов.
синхронизирует данные в положительной последовательности и сохраняет последний идентификатор в Redis.
Вот некоторые коды для вас:
var maxMigrateId = 0;
redis.get(maxMigrateIdKey, function (err, result) {
if(err){
console.error("[ERROR] - "+err)
}
if(result){
maxMigrateId = result;
}
console.log('MaxMigrateId: ' + maxMigrateId);
mysql_read_pool.query("select id , uuid from {your original table} where id > ? limit 1000", [maxMigrateId], function (err, results) {
if(err){
throw err;
}
console.log('[Query Result Length] - ' + results.length);
var migratePromises = []
migratePromises.push(migrateData(results, mysql_write_pool_prod))
Promise.all(migratePromises).then(()=>{
redis.set(maxMigrateIdKey, maxMigrateId);
console.log('finished');
process.exit();
}).catch((err)=>{
console.log('Error: '+err);
})
});
});
function async migrateData(items, write_pool){
var sql = "insert into ${your target table} (id, uuid) values"
var dataValues = []
items.forEach((data)=>{
var list = [data.id, data.uuid];
var val = "('" + list.join("','") + "')";
dataValues.push(val);
});
sql += dataValues.join(',');
return new Promise((resolve, reject)=>{
write_pool.query(sql, [], function (error, results, fields) {
if (error){
reject(error);
}
resolve(true)
});
});
}