问题:
我们知道在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的时候写变更到指定文件,后台则监视该文件变动。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)