滚服游戏合服之数据库数据合并

为什么要合服?

游戏运行一段时间后(2个月,3个月不等),单服留存的玩家数量很少,而且大多是小号。为了节约服务器资源,增加玩家之间的互动,就需要把两个或者多个服务器的留存玩家合并在一起。
合服主要是数据的合并。把两个或多个单独的服务器数据合并到一个服里面。

这里合服的数据为什么不会有主键冲突,关键在于设计游戏的时候,主键是根据区服id进行生成的,下次我讲单独一篇文章讲解如何设计服务器id主键的规则。(ID生成器已写,见下面链接)
游戏开发 数据库ID设计 ID生成器

合服数据操作步骤,下面以区服1、区服2合并到主服区服1的操作示例:

游戏1-2区合并到游戏1区, 分别操作数据库db_game_1,db_game_2

1、数据备份。

服务器关入口,停机。备份数据库:

1.1备份需要合并的所有数据库:

mysqldump -uroot -p db_game_1 > db_game_1_20200506.sql
mysqldump -uroot -p db_game_2 > db_game_2_20200506.sql

2、下载,并导入本地库。

把备份文件下载到本地,并导入本地db中。

这里解释一下为什么要下载到本地来操作,因为线上的数据库是生产环境,上面还有可能还有其他区服在运行,如果操作失误容易出现事故,导到本地操作更安全。

2.1本地提前准备好空的数据库db_game_1,db_game_2

CREATE DATABASE `db_game_1` CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE DATABASE `db_game_2` CHARACTER SET utf8 COLLATE utf8_general_ci

2.2分别导入到对应库中。

mysql -uroot -p db_game_1 < db_game_1_20200506.sql
mysql -uroot -p db_game_2 < db_game_2_20200506.sql

3、清小号。

执行清空无用的表及小号sql。这里利用一个中间表格t_temp来存放要删除的小号玩家id。

3.1在下面sql中修改引用的db:use db_game_1; 分别清除1服和2服的小号数据。

3.2在sql中修改最后登出时间logoutTime<1586966400,修改为7天前。
等级为小于60的玩家数据。这个根据每个游戏的实际情况来修改。

/* 切换db */
use db_game_1;

/* 全清的表:这些都是单服数据的表格,合服后不需要的数据,可以全部清空 */
truncate t_day_server_boss;
truncate t_day_server_boss_damage;

/* sql清理一下表的数据,删除一些冗余的数据 */
DELETE FROM t_player_operation_activity WHERE start_day=0 AND end_day=0 AND param1=0;
DELETE FROM t_player_server_active WHERE cur_val<=0;
/* 物品表  */
DELETE FROM t_player_goods WHERE num = 0;

	
/* 创建临时中间表t_temp来存放需要删除的玩家id */
DROP TABLE IF EXISTS `t_temp`;
CREATE TABLE `t_temp` (
  `playerid` bigint(20) NOT NULL,
  PRIMARY KEY (`playerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/* 充值账号保留。其他小号数据, 等级小于 60,且一周没有登录 大于等于7天的 1587571200(修改此时间戳)  */
INSERT into t_temp (playerid) SELECT DISTINCT player_id FROM t_player WHERE hero_level <60 AND logoutTime<1587571200 AND player_id NOT IN (SELECT id FROM t_player_recharge WHERE total_recharge_value > 0);

DELETE FROM t_new_player_team_instance 			WHERE id 			IN (SELECT playerid FROM t_temp) ;
DELETE FROM t_player_abi_hell		 			WHERE id 			IN (SELECT playerid FROM t_temp) ;
DELETE FROM t_player_arena 						WHERE id 			IN (SELECT playerid FROM t_temp) ;
DELETE FROM t_player 							WHERE id 			IN (SELECT playerid FROM t_temp) ;
/* .....等等就不罗列那么多表格了 */

/* 最后 删除t_temp表 */
drop table t_temp;

4、(可选)表格数据准确性校验。

数据准确性校验:执行 selectcount 里面的sql(来源9.2步骤)。把查询结果分别保存下来。

4.1如表格不全,执行本文第 9.2、 点拿到最新的查询表格sql。

4.2修改db名字db_game_1。分别查询清除小号前后db_game_1和db_game_2的数据量。

4.3执行sql,并把结果分别保存下来。后面放到excel进行统计。

5、表结构同步。

对比多个库db_game_1和db_game_2的表结构是否一致,不一致则同步为一样的。操作:

5.1使用navicat for mysql工具。选择 工具->结构同步 >

5.2选择源库DB1, 目标库DB2(目标库是被修改结构的库),可以反过来。

5.3点击 对比

5.4如有不一致的表格,勾选查询出来的结果,点击 运行查询

6、合并数据。

把从区db_game_2的数据合并到主服db_game_1上去。执行 insert 的sql。

6.1insert语句可以执行本文第 9.3、点拿到最新的插入数据sql语句。

6.2需修改目标DB名称:db_game_1和源DB名称:db_game_2。

6.3执行sql,等待结果,查看日志。(有出错单独处理)

6.4(可选)执行4.3的sql查询数据校验数据量。

6.5执行完所有库之后,把主服数据导出,并上传到游戏服

mysqldump -uroot -p db_game_1> db_game_1-2H_20200506.sql

6.6删除合服目标服db的表格。

6.7导入合服后的数据

mysql -uroot -p db_game_1 < db_game_1-2H_20200506.sql

7、服务器配置修改。

7.1 在后台修改合服的配置和入口检查config.properties配置文件中的合服id和合服时间是否正确

8、休息一会,喝杯茶稳住操作。

9、查看表格名称及行数,

9.1、查看表格名称及行数(这个行数不准确)。后面可加order by table_rows 按数据量排序。

use information_schema;
select table_name,table_rows from tables where TABLE_SCHEMA = 'db_game_1';

9.2、查询表格sql。(修改目标db:db_game_1)

use information_schema;
SELECT CONCAT('select count(*) from db_game_1.',TABLE_NAME,';') from tables where TABLE_SCHEMA = 'db_game_1';

9.3、直接查询出指定的sql语句操作。(修改目标db:db_game_1,源db:db_game_2)

use information_schema;
SELECT CONCAT('insert into db_game_1.',TABLE_NAME,' select * from db_game_2.',TABLE_NAME,';') from tables where TABLE_SCHEMA = 'db_game_1';

至此,合服数据操作完成。
剩下就是把服务区服起服,然后验证准确性即可。

欢迎您点赞 评论,您的支持是我最大的动力~

↓ 动动您的贵手 点赞 收藏 (方便您下次查阅) 谢谢~(❁´◡`❁)✲゚

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执子之意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值