跳到主要内容

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

一、扩容原则

  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. 对于生产环境,建议先在测试环境验证备份恢复过程