跳到主要内容

数据库扩容方案 (支持千亿级别数据)

一、扩容原则​

  1. 兼容性原则:确保现有系统正常运行,新旧数据格式共存
  2. 渐进式迁移:分阶段实施,降低风险
  3. 性能优化:在扩容同时考虑查询效率
  4. 数据安全:确保迁移过程数据完整性

二、核心表扩容方案​

1. CHARBASE 表 (角色基础表)​

-- 原结构
CREATE TABLE `CHARBASE` (
`CHARID` int(10) unsigned NOT NULL auto_increment,
`ACCID` int(10) unsigned NOT NULL default '0',
-- ...其他字段
`MONEY` int(10) unsigned NOT NULL default '0',
`GOLD` int(10) unsigned NOT NULL default '0',
`EXP` bigint(20) unsigned NOT NULL default '0'
);

-- 扩容方案
ALTER TABLE `CHARBASE`
MODIFY COLUMN `CHARID` bigint(20) unsigned NOT NULL auto_increment,
MODIFY COLUMN `ACCID` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `MONEY` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `GOLD` bigint(20) unsigned NOT NULL default '0',
ADD COLUMN `accid_high` int(10) unsigned NOT NULL default '0' AFTER `ACCID`, -- 兼容字段
ADD COLUMN `charid_high` int(10) unsigned NOT NULL default '0' AFTER `CHARID`; -- 兼容字段

说明:

  • 将ID和数值类字段从INT改为BIGINT
  • 添加高低位兼容字段,确保旧代码能继续运行

2. BALANCE 表 (账户余额表)​

ALTER TABLE `BALANCE`
MODIFY COLUMN `ACCID` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `ALLGOLDIN` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `ALLGOLDOUT` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `ALLMONEYIN` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `ALLMONEYOUT` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `GOLD` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `MONEY` bigint(20) unsigned NOT NULL default '0';

3. COUNTRY 表 (国家资源表)​

ALTER TABLE `COUNTRY`
MODIFY COLUMN `GOLD` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `SILK` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `ORE` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `BOWLDER` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `WOOD` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `COAT` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `HERBAL` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `MATERIAL` bigint(20) unsigned NOT NULL default '0',
MODIFY COLUMN `STOCK` bigint(20) unsigned NOT NULL default '0';

三、相关表扩容清单​

表名需要扩容的字段新类型备注
AUCTIONID, MINMONEY, MAXMONEY, MINGOLD, MAXGOLDBIGINT拍卖行数据
CONSIGNGOLDID, ACCID, NUM, PRICEBIGINT金币寄售
CONSIGNMONEYID, ACCID, NUM, PRICEBIGINT银子寄售
MAILID, SENDMONEY, RECVMONEY, SENDGOLD, RECVGOLDBIGINT邮件系统
SEPTSEPTID, CHARID, REPUTE, SPENDGOLDBIGINT家族数据
UNIONUNIONID, CHARID, EXP, MONEYBIGINT帮会数据

四、数据迁移方案​

1. 准备阶段​

-- 创建临时表存储旧数据
CREATE TABLE CHARBASE_BAK LIKE CHARBASE;
INSERT INTO CHARBASE_BAK SELECT * FROM CHARBASE;

-- 添加兼容性视图
CREATE VIEW v_charbase_compat AS
SELECT
CHARID, ACCID,
CHARID as charid_low, 0 as charid_high,
ACCID as accid_low, 0 as accid_high,
-- 其他字段...
FROM CHARBASE;

2. 执行阶段​

-- 1. 修改表结构
ALTER TABLE CHARBASE ...; -- 如上所述修改

-- 2. 数据迁移脚本
UPDATE CHARBASE SET
charid_low = CHARID,
charid_high = 0,
accid_low = ACCID,
accid_high = 0;

-- 3. 更新应用程序
-- 将旧版SQL查询改为使用兼容视图

3. 验证阶段​

-- 数据一致性检查
SELECT COUNT(*) FROM CHARBASE_BAK
WHERE NOT EXISTS (
SELECT 1 FROM CHARBASE
WHERE CHARBASE.CHARID = CHARBASE_BAK.CHARID
);

-- 性能测试
EXPLAIN SELECT * FROM CHARBASE WHERE CHARID = 12345;

五、回滚方案​

-- 如果出现问题,回退到旧表结构
RENAME TABLE CHARBASE TO CHARBASE_NEW, CHARBASE_BAK TO CHARBASE;

-- 重建索引
ALTER TABLE CHARBASE ADD PRIMARY KEY (CHARID);
ALTER TABLE CHARBASE ADD KEY `ACCID` (`ACCID`);

六、注意事项​

  1. 停机时间:建议在低峰期执行,提前公告
  2. 备份策略:
    mysqldump -u root -p ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql
  3. 版本控制:在表结构中添加版本标记
    ALTER TABLE CHARBASE ADD COLUMN `data_version` SMALLINT NOT NULL DEFAULT 1;
  4. 客户端适配:分阶段更新客户端,支持新旧数据格式

此方案确保在不影响现有游戏运行的前提下,逐步将数据库支持扩展到千亿级别,同时保留完整的回滚能力。

MySQL 数据库备份与恢复命令

备份命令 (已提供)​

mysqldump -u root -p ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql

这个命令会:

  1. 使用root用户连接MySQL (-u root)
  2. 提示输入密码 (-p)
  3. 备份整个ZtGameDB数据库
  4. 输出到以当前日期命名的SQL文件

对应的导入/恢复命令​

基本恢复命令​

mysql -u root -p ZtGameDB < ZtGameDB_backup_20250106.sql

更完整的恢复方案​

  1. 先创建数据库(如果需要)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ZtGameDB"
  1. 完整恢复命令
mysql -u root -p ZtGameDB < ZtGameDB_backup_20250106.sql

高级选项​

  1. 恢复时显示进度
pv ZtGameDB_backup_20250106.sql | mysql -u root -p ZtGameDB
  1. 恢复时忽略错误
mysql -u root -p ZtGameDB --force < ZtGameDB_backup_20250106.sql
  1. 从压缩备份恢复
gunzip < ZtGameDB_backup_20250106.sql.gz | mysql -u root -p ZtGameDB

注意事项​

  1. 确保MySQL服务正在运行
  2. 恢复前最好先备份当前数据库
  3. 大型数据库恢复可能需要较长时间
  4. 恢复操作会覆盖现有数据
  5. 确保有足够的磁盘空间

完整备份恢复流程示例​

# 1. 备份当前数据库(安全起见)
mysqldump -u root -p ZtGameDB > ZtGameDB_current_backup.sql

# 2. 恢复备份
mysql -u root -p ZtGameDB < ZtGameDB_backup_20250106.sql

# 3. 验证恢复结果
mysql -u root -p -e "USE ZtGameDB; SHOW TABLES;"

实际恢复​

mysqldump -u ztgame -p123456 ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql
mysql -u ztgame -p123456 ZtGameDB < ZtGameDB.sql
mysql -u ztgame -p123456 FLServerDB < FLServerDB.sql

MySQL 备份乱码问题解决方案​

问题分析​

您遇到的乱码问题是由于备份时字符集设置不正确导致的。从您提供的示例来看:

  • 原始数据库使用的是latin1字符集
  • 但备份时可能没有正确指定字符集,导致中文显示为乱码

解决方案​

1. 正确的备份命令(指定字符集)​

mysqldump -u ztgame -p123456 --default-character-set=latin1 ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql

关键参数:

  • --default-character-set=latin1:明确指定使用latin1字符集进行备份

2. 恢复时指定字符集​

mysql -u ztgame -p123456 --default-character-set=latin1 ZtGameDB < ZtGameDB_backup_20250106.sql

3. 完整备份恢复方案(避免乱码)​

# 备份
mysqldump -u ztgame -p123456 --default-character-set=latin1 --hex-blob --skip-set-charset --complete-insert ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql
mysqldump -u ztgame -p123456 --default-character-set=latin1 --hex-blob --skip-set-charset --complete-insert ZtGameDB > ZtGameDB.sql
mysqldump -u ztgame -p123456 --default-character-set=latin1 --hex-blob --skip-set-charset --complete-insert FLServerDB > FLServerDB.sql
mysqldump -u ztgame -p123456 --default-character-set=latin1 --hex-blob --skip-set-charset --complete-insert FLServerDB > FLServerDB_backup_$(date +%Y%m%d).sql

# 恢复
mysql -u ztgame -p123456 --default-character-set=latin1 ZtGameDB < ZtGameDB.sql
mysql -u ztgame -p123456 --default-character-set=latin1 FLServerDB < FLServerDB.sql

创建GBK编码的数据库​

mysql -u ztgame -p123456 -e "CREATE DATABASE ZtGameDB_gbk CHARACTER SET gbk COLLATE gbk_chinese_ci"

# 导入修复后的备份
mysql -u ztgame -p123456 --default-character-set=gbk ZtGameDB_gbk < ZtGameDB_backup_gbk_fixed.sql

其他有用的参数​

  1. --hex-blob:以十六进制格式导出二进制数据
  2. --skip-set-charset:不写入SET NAMES语句
  3. --complete-insert:使用完整的INSERT语句格式

永久解决方案​

  1. 修改数据库字符集(推荐):

    ALTER DATABASE ZtGameDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 修改表字符集:

    ALTER TABLE SERVERLIST CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意事项​

  1. 如果数据原本是以latin1存储但实际是中文,可能需要特殊转换:

    iconv -f latin1 -t utf8 ZtGameDB_backup_$(date +%Y%m%d).sql > ZtGameDB_backup_$(date +%Y%m%d)_utf8.sql
  2. 修改字符集前务必备份数据

  3. 对于生产环境,建议先在测试环境验证备份恢复过程