MYSQL线上大表字段改动方案

MYSQL线上大表字段改动方案,第1张

问题:

我们知道在MySQL中如果要执行ALTER TABLE *** 作,MySQL会通过制作原来表的一个临时副本来工作。对于表结构的修改在副本上施行,然后将新表替换原始表,此时会产生锁表,用户可以从原始表读取数据,而用户的更新和写入 *** 作都会被lock,待新表准备好后写入新表。

由于在这个过程中会锁表。造成当前 *** 作的表无法写入数据,影响用户使用。由于需要复制原表的数据到中间表,所以表的数据量越大,等待的时候越长,卡死在那里(用户被拒绝执行update和insert *** 作,表现就是延迟了一直在等待)。

解决方式:

我们这里借助影子拷贝的思想利用mysql load data 与 select into outfile手动导数据:

导出语法:

导入语法:

原表结构:

目标表结构:

在mysql命令行执行命令

这一步可能会报错:

解决方式:

在/etc/my.cnf配置文件中加入 secure-file-priv='' ,然后重启mysql服务器, service mysqld restart

也有可能会报错:

解决方式:

给mysql用户加上/tmp/data目录的rwx权限就可以啦

完成

表发生变化的话需要用触发器,但是想通知外部的话只能通过UDF。

一个思路是用mysql-udf-http,然后在trigger里POST/GET到后台的API。

另外,如果数据库和后台在同一个服务器上的话,可以考虑自己写一个UDF,trigger的时候写变更到指定文件,后台则监视该文件变动。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6168657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存