全栈之路 -- 多数据库合并工作的复盘笔记

需要是把数据库a(后台数据库)的数据都导入到数据库b(前台数据库)中去。计划的时候凌晨0点做,因为这个时候使用后台的人少,首先我在代码上的控制是从0点开始,所有写入操作全部不执行。然后开始倒表。

获取database_a数据库的所有表

mysql -uroot -P3306 database_a -e"show tables\G" |grep Tables_in_database_a |awk -F: '{print $2}' > list.txt

导出数据

for i in `cat list.txt` ;do mysqldump -uroot -P3306 database_a  $i > table_$i.sql;done

导入到database_b里面去

for i in `cat list.txt`;do mysql -uroot -P3306 database_b < table_$i.sql;done

数据库的迁移,到这里就结束了。代码里原来访问a数据库的连接,配置都需要切换到b数据库上。后来发现了一些问题。

反思与小结

没有禁止一切对旧数据库的写入操作(子项目,计划任务)

做数据库迁移的时候,只提前禁止了Web项目中数据库写入,但是忘记了计划任务里面还有很多对该数据库的写操作,而正好很多统计工作也是在凌晨之后才执行,导致数据迁移的时候有遗漏,都写到了旧的数据库中去了。

这是第二天,查看昨日一些统计分析数据时候发现的,也就是说,迁移库相关的计划任务也应该相对调整,延时执行或者记录到临时库。

遗漏了对代码里面的不规范的数据库连接操作修改

代码里有多套数据库操作类,因为整个系统代码有重写的新代码,当时只改了新版数据库操作类里面的数据库配置,没有修改老版本的数据库配置(老版本没有数专门的数据库配置文件),所以这个时候更应该全局搜索下迁移之前的数据库服务器的ip地址+端口号,以免遗漏。

这是过了几天之后,客户端在调用某个api的时候直接崩溃了发现的。也是统计相关,由于老数据库没删,所以最开始没发现,但是到了新的一周,没有新数据库入库,问题旧暴露出来了。

这个问题属于代码管理不规范造成的,但是不能忽略这个问题存在的可能性。

没有检查所有服务器对数据库权限是否正常

原来所有机器对a数据库是有权限的,其中一部分机器也对b数据库有权限的。但是有部分服务器只对a数据库就行操作,没有b数据库的权限。

这也也是过了一段时间之后,还是用户反馈打开某个界面的时候app会闪退,但是不是每次都出现,所以想到是后端某台机器出现了问题。果不其然,我一台台测试之后,发现有一台访问的时候之前做修改的一个数据库查询返回结果为空,在确定了代码是一致的情况下,最后定位为数据访问权限的问题。

上一篇:迎接大数据 国产数据库产品策略盘点


下一篇:Ognl表达式基本原理和使用方法