为什么要合服? 游戏运行一段时间后(2个月,3个月不等),单服留存的玩家数量很少,而且大多是小号。为了节约服务器资源,增加玩家之间的互动,就需要把两个或者多个服务器的留存玩家合并在一起。 这里合服的数据为什么不会有主键冲突,关键在于设计游戏的时候,主键是根据区服id进行生成的,下次我讲单独一篇文章讲解如何设计服务器id主键的规则。 合服数据操作步骤,下面以区服1、区服2合并到主服区服1的操作示例: 游戏1-2区合并到游戏1区, 分别操作数据库db_game_1,db_game_2 1、数据备份。 服务器关入口,停机。备份数据库: 1.1备份需要合并的所有数据库: 2、下载,并导入本地库。 把备份文件下载到本地,并导入本地db中。 这里解释一下为什么要下载到本地来操作,因为线上的数据库是生产环境,上面还有可能还有其他区服在运行,如果操作失误容易出现事故,导到本地操作更安全。 2.1本地提前准备好空的数据库db_game_1,db_game_2 2.2分别导入到对应库中。 3、清小号。 执行清空无用的表及小号sql。这里利用一个中间表格t_temp来存放要删除的小号玩家id。 3.1在下面sql中修改引用的db:use db_game_1; 分别清除1服和2服的小号数据。 3.2在sql中修改最后登出时间logoutTime<1586966400,修改为7天前。 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执行完所有库之后,把主服数据导出,并上传到游戏服: 6.6删除合服目标服db的表格。 6.7导入合服后的数据 7、服务器配置修改。 7.1 在后台修改合服的配置和入口检查config.properties配置文件中的合服id和合服时间是否正确 8、休息一会,喝杯茶稳住操作。 9、查看表格名称及行数, 9.1、查看表格名称及行数(这个行数不准确)。后面可加order by table_rows 按数据量排序。 9.2、查询表格sql。(修改目标db:db_game_1) 9.3、直接查询出指定的sql语句操作。(修改目标db:db_game_1,源db:db_game_2) 至此,合服数据操作完成。
合服主要是数据的合并。把两个或多个单独的服务器数据合并到一个服里面。mysqldump -uroot -p db_game_1 > db_game_1_20200506.sql
mysqldump -uroot -p db_game_2 > db_game_2_20200506.sql
CREATE DATABASE `db_game_1` CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE DATABASE `db_game_2` CHARACTER SET utf8 COLLATE utf8_general_ci
mysql -uroot -p db_game_1 < db_game_1_20200506.sql
mysql -uroot -p db_game_2 < db_game_2_20200506.sql
等级为小于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;
mysqldump -uroot -p db_game_1> db_game_1-2H_20200506.sql
mysql -uroot -p db_game_1 < db_game_1-2H_20200506.sql
use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = 'db_game_1';
use information_schema; SELECT CONCAT('select count(*) from db_game_1.',TABLE_NAME,';') from tables where TABLE_SCHEMA = 'db_game_1';
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';
剩下就是把服务区服起服,然后验证准确性即可。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算