| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /**
- * 恢复 game_enter_server 脚本
- * 运行: node recover_enter_server.js
- * 会直接打印 INSERT 语句到控制台
- *
- * 依赖: mysql2, mongodb(项目已有,直接用 node_modules)
- */
- const mysql = require('mysql2/promise');
- const { MongoClient } = require('mongodb');
- // ========== 配置 ==========
- const MYSQL_CONFIG = {
- host: '127.0.0.1',
- port: 3306,
- user: 'root',
- password: 'wch123.com',
- database: 'sdk',
- };
- const MONGO_URL = 'mongodb://localhost:27017';
- // ==========================
- function escapeStr(str) {
- return String(str).replace(/\\/g, '\\\\').replace(/'/g, "\\'");
- }
- async function main() {
- const conn = await mysql.createConnection(MYSQL_CONFIG);
- const [servers] = await conn.query(`
- SELECT id, db_name, sid, tag, open_time
- FROM game_server
- WHERE tag = 11
- AND db_name IS NOT NULL
- AND db_name != ''
- `);
- if (servers.length === 0) {
- console.log('-- 未查询到 tag=11 的区服');
- await conn.end();
- return;
- }
- console.error(`找到 ${servers.length} 个 tag=11 区服,开始查询 MongoDB...`);
- const mongoClient = await MongoClient.connect(MONGO_URL);
- const inserts = [];
- for (const server of servers) {
- const { sid: serverId, db_name: dbName, tag, open_time: openTime } = server;
- let chars = [];
- try {
- chars = await mongoClient.db(dbName)
- .collection('char')
- .find({}, { projection: { newUniqueTag: 1, _id: 0 } })
- .toArray();
- } catch (e) {
- console.error(`[SKIP] ${dbName} 查询失败: ${e.message}`);
- continue;
- }
- console.error(` [${dbName}] server_id=${serverId} 角色数=${chars.length}`);
- for (const char of chars) {
- const raw = char.newUniqueTag;
- if (!raw) continue;
- // newUniqueTag 格式: tag|sid|uid
- const parts = raw.split('|');
- const uid = parts[parts.length - 1];
- if (!uid) continue;
- const createTime = openTime && openTime > 0
- ? `FROM_UNIXTIME(${openTime})`
- : 'NOW()';
- inserts.push(
- `('${escapeStr(uid)}', '${serverId}', ${createTime}, '${serverId}', ${tag})`
- );
- }
- }
- await mongoClient.close();
- await conn.end();
- if (inserts.length === 0) {
- console.error('未找到任何角色数据');
- return;
- }
- console.error(`共生成 ${inserts.length} 条记录,输出 INSERT 语句:`);
- console.log('');
- console.log(`-- 恢复 game_enter_server,共 ${inserts.length} 条`);
- console.log('');
- // 每 500 条一批
- const batchSize = 500;
- for (let i = 0; i < inserts.length; i += batchSize) {
- const batch = inserts.slice(i, i + batchSize);
- console.log('INSERT INTO `game_enter_server` (`uid`, `server_id`, `create_time`, `first_server_id`, `tag`) VALUES');
- console.log(batch.join(',\n') + ';');
- console.log('');
- }
- }
- main().catch(err => {
- console.error('脚本执行失败:', err);
- process.exit(1);
- });
|