recover_enter_server.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /**
  2. * 恢复 game_enter_server 脚本
  3. * 运行: node recover_enter_server.js
  4. * 会直接打印 INSERT 语句到控制台
  5. *
  6. * 依赖: mysql2, mongodb(项目已有,直接用 node_modules)
  7. */
  8. const mysql = require('mysql2/promise');
  9. const { MongoClient } = require('mongodb');
  10. // ========== 配置 ==========
  11. const MYSQL_CONFIG = {
  12. host: '127.0.0.1',
  13. port: 3306,
  14. user: 'root',
  15. password: 'wch123.com',
  16. database: 'sdk',
  17. };
  18. const MONGO_URL = 'mongodb://localhost:27017';
  19. // ==========================
  20. function escapeStr(str) {
  21. return String(str).replace(/\\/g, '\\\\').replace(/'/g, "\\'");
  22. }
  23. async function main() {
  24. const conn = await mysql.createConnection(MYSQL_CONFIG);
  25. const [servers] = await conn.query(`
  26. SELECT id, db_name, sid, tag, open_time
  27. FROM game_server
  28. WHERE tag = 11
  29. AND db_name IS NOT NULL
  30. AND db_name != ''
  31. `);
  32. if (servers.length === 0) {
  33. console.log('-- 未查询到 tag=11 的区服');
  34. await conn.end();
  35. return;
  36. }
  37. console.error(`找到 ${servers.length} 个 tag=11 区服,开始查询 MongoDB...`);
  38. const mongoClient = await MongoClient.connect(MONGO_URL);
  39. const inserts = [];
  40. for (const server of servers) {
  41. const { sid: serverId, db_name: dbName, tag, open_time: openTime } = server;
  42. let chars = [];
  43. try {
  44. chars = await mongoClient.db(dbName)
  45. .collection('char')
  46. .find({}, { projection: { newUniqueTag: 1, _id: 0 } })
  47. .toArray();
  48. } catch (e) {
  49. console.error(`[SKIP] ${dbName} 查询失败: ${e.message}`);
  50. continue;
  51. }
  52. console.error(` [${dbName}] server_id=${serverId} 角色数=${chars.length}`);
  53. for (const char of chars) {
  54. const raw = char.newUniqueTag;
  55. if (!raw) continue;
  56. // newUniqueTag 格式: tag|sid|uid
  57. const parts = raw.split('|');
  58. const uid = parts[parts.length - 1];
  59. if (!uid) continue;
  60. const createTime = openTime && openTime > 0
  61. ? `FROM_UNIXTIME(${openTime})`
  62. : 'NOW()';
  63. inserts.push(
  64. `('${escapeStr(uid)}', '${serverId}', ${createTime}, '${serverId}', ${tag})`
  65. );
  66. }
  67. }
  68. await mongoClient.close();
  69. await conn.end();
  70. if (inserts.length === 0) {
  71. console.error('未找到任何角色数据');
  72. return;
  73. }
  74. console.error(`共生成 ${inserts.length} 条记录,输出 INSERT 语句:`);
  75. console.log('');
  76. console.log(`-- 恢复 game_enter_server,共 ${inserts.length} 条`);
  77. console.log('');
  78. // 每 500 条一批
  79. const batchSize = 500;
  80. for (let i = 0; i < inserts.length; i += batchSize) {
  81. const batch = inserts.slice(i, i + batchSize);
  82. console.log('INSERT INTO `game_enter_server` (`uid`, `server_id`, `create_time`, `first_server_id`, `tag`) VALUES');
  83. console.log(batch.join(',\n') + ';');
  84. console.log('');
  85. }
  86. }
  87. main().catch(err => {
  88. console.error('脚本执行失败:', err);
  89. process.exit(1);
  90. });