数据库在使用中是否能删除外键?

空心兜兜 2017-11-08 04:28:34
RT,现有一套正在运行的JavaWeb程序与MySQL数据库,目前一共40多张表,560多万条记录,大约每天产生一万条左右。
目前做了业务范围升级,也考虑做MySQL Cluster,但因为MySQL Cluster的ndbcluster引擎不支持外键,所以打算本次把原先的外键先删除,然后备库还原到集群中,最后做新数据表添加。
在本地测试了一下,删除六个表的外键,耗费了近2个小时(备份不到20分钟,还原近一个半小时)。
因业务比较关键,发生频率较高,时间也不确定,所以想尽量减少服务停机时间,能否在不停止程序服务的情况下,数据库发生读写操作时删除外键?
因为没做过这样的事情,有点担心安全问题。
...全文
241 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
空心兜兜 2017-11-14
引用 5 楼 zjcxc 的回复:
不知道你是用佬备份还原方法,如果用的是 mysqldump 备份,则你可以把建表的数据分开,然后在结构的脚本中把外键的部分去掉 这样还原出的结果就是你要的,不要等数据还原后再去删除外键
好的,多谢
回复
空心兜兜 2017-11-14
引用 8 楼 ACMAIN_CHM 的回复:
删除外键需要锁表,建议在业务空闲的时候做。
好的,多谢
回复
空心兜兜 2017-11-14
引用 3 楼 wandier 的回复:
建议楼主凌晨升级,减少业务中断时间,560万批量导入应该没有那么慢
我这边试着用Navicat工具导入,将近2小时,备份出来要20分钟左右。
回复
ACMAIN_CHM 2017-11-12
删除外键需要锁表,建议在业务空闲的时候做。
回复
不会发生什么安全问题,更改索引的操作是会锁表的,所以不存在更改索引时会发生读写操作的问题。不过导出导入数据没必要更改索引,导出时肯定没必要更改索引,导入到新表时,新表不建立不需要的索引不得了?还有就是数据量不到10亿级别我是不会考虑集群的,如果真有这需要,你还要考虑对当前业务逻辑的改动,这个工作量也很大的,因为没有外键约束了,数据的一致性约束需要转移到业务模块中自己去实现,牵扯的太多。
回复
不知道你是用佬备份还原方法,如果用的是 mysqldump 备份,则你可以把建表的数据分开,然后在结构的脚本中把外键的部分去掉 这样还原出的结果就是你要的,不要等数据还原后再去删除外键
回复
wandier 2017-11-09
导入数据时,表不要建索引,导入后,重新建索引,应该不会慢,可以试试
回复
wandier 2017-11-09
建议楼主凌晨升级,减少业务中断时间,560万批量导入应该没有那么慢
回复
wandier 2017-11-09
引用 1 楼 rucypli的回复:
560多万条记录就要升级 至少5亿条再考虑升级吧
560就不能升级了,能给问题就行,不要酸人
回复
rucypli 2017-11-08
560多万条记录就要升级 至少5亿条再考虑升级吧
回复
发动态
发帖子
MySQL
创建于2007-09-28

5.4w+

社区成员

MySQL相关内容讨论专区
申请成为版主
社区公告
暂无公告