数据库扩容方案 (支持千亿级别数据)
一、扩容原则
- 兼容性原则:确保现有系统正常运行,新旧数据格式共存
- 渐进式迁移:分阶段实施,降低风险
- 性能优化:在扩容同时考虑查询效率
- 数据安全:确保迁移过程数据完整性
二、核心表扩容方案
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';
三、相关表扩容清单
表名 | 需要扩容的字段 | 新类型 | 备注 |
---|---|---|---|
AUCTION | ID, MINMONEY, MAXMONEY, MINGOLD, MAXGOLD | BIGINT | 拍卖行数据 |
CONSIGNGOLD | ID, ACCID, NUM, PRICE | BIGINT | 金币寄售 |
CONSIGNMONEY | ID, ACCID, NUM, PRICE | BIGINT | 银子寄售 |
ID, SENDMONEY, RECVMONEY, SENDGOLD, RECVGOLD | BIGINT | 邮件系统 | |
SEPT | SEPTID, CHARID, REPUTE, SPENDGOLD | BIGINT | 家族数据 |
UNION | UNIONID, CHARID, EXP, MONEY | BIGINT | 帮会数据 |
四、数据迁移方案
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`);
六、注意事项
- 停机时间:建议在低峰期执行,提前公告
- 备份策略:
mysqldump -u root -p ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql
- 版本控制:在表结构中添加版本标记
ALTER TABLE CHARBASE ADD COLUMN `data_version` SMALLINT NOT NULL DEFAULT 1;
- 客户端适配:分阶段更新客户端,支持新旧数据格式
此方案确保在不影响现有游戏运行的前提下,逐步将数据库支持扩展到千亿级别,同时保留完整的回滚能力。
MySQL 数据库备份与恢复命令
备份命令 (已提供)
mysqldump -u root -p ZtGameDB > ZtGameDB_backup_$(date +%Y%m%d).sql
这个命令会:
- 使用root用户连接MySQL (
-u root
) - 提示输入密码 (
-p
) - 备份整个ZtGameDB数据库
- 输出到以当前日期命名的SQL文件
对应的导入/恢复命令
基本恢复命令
mysql -u root -p ZtGameDB < ZtGameDB_backup_20250106.sql
更完整的恢复方案
- 先创建数据库(如果需要)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ZtGameDB"
- 完整恢复命令
mysql -u root -p ZtGameDB < ZtGameDB_backup_20250106.sql
高级选项
- 恢复时显示进度
pv ZtGameDB_backup_20250106.sql | mysql -u root -p ZtGameDB
- 恢复时忽略错误
mysql -u root -p ZtGameDB --force < ZtGameDB_backup_20250106.sql
- 从压缩备份恢复
gunzip < ZtGameDB_backup_20250106.sql.gz | mysql -u root -p ZtGameDB
注意事项
- 确保MySQL服务正在运行
- 恢复前最好先备份当前数据库
- 大型数据库恢复可能需要较长时间
- 恢复操作会覆盖现有数据
- 确保有足够的磁盘空间
完整备份恢复流程示例
# 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