原因:前一段时间一直给领导反映,数据库虽然一个小时备份一次,但是仍然很危险,要是mysql服务器突然宕机,或者磁盘出现故障,不仅mysql站点会受到很大的威胁,而且即使恢复数据库也需要十多分钟的时间,造成网站会无法访问因此。强烈建议做一个slave;最终,领导听取了我的意见。(虽然公司800人左右,但是服务器并没那么多,算是小企业)
做slave的好处
1)当前数据库一个小时备份一次,而且异地本地。二进制日志是开启的。所以当mysql服务器不出现问题的时候,一切都好说。出了事情,坏事。。。
2)做slave,那样就算主服务器出现什么意外,也可以快速切换到从服务器,减少了网站不能运行的时间。
3)slave的备份间隔和master服务器间隔相差半小时,那样进一步减少了数据丢失的风险,虽然公司并发并不大。
4)做了slave之后,slave也有自己的二进制日志,那样半个小时的数据风险算是可以补救了。(只要两台别同时出现故障)
当方案什么都提交之后,问题来了,领导想让从新在两台服务器上做主从,那样就算master和slave环境搭建好之后,领导担心短时间内会影响业务,也影响网站的运行
(在导入数据库需要时间,如果停止mysql服务,那么网站不能正常运行,如果不停止网站,那么短时间内会有稍微的数据不一样,万一数据库进行了写操作呢?毕竟网站不能正常运行,算是大事了)
行吧,我给了个意见,不停止当前数据库,而是当主从服务器环境搭建好,就差导入数据的时候,先对现在的服务器进行锁表,禁止写操作,然后等master和slave数据同步,且master数据完全导入,然后切换数据库。(并且在下班时间,晚上10点以后操作)
方案通过!!!
上面的命令意思是,全局锁表,所有表都不可写,
下面是解锁。
再执行下锁表。
进行一个写操作
报错说,表已经被锁,只读,不可以写。
然后解锁,再进行操作!
ok!!!
给大家分享点锁表的知识。
1.FLUSH TABLES WITH READ LOCK
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。
解锁的语句也是unlock tables。
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。
解锁语句也是unlock tables。
这两个语句在执行的时候都需要注意个特点,就是 隐式提交的语句。在退出mysql终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。
P.S. MYSQL的read lock和wirte lock
read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁
write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁
然后我又想到了一个小问题。如果有多个数据库,那么对应不同的网站,如果全局锁表就不好了。但是呢,要是一个个锁表,亲,那么多,怎么锁啊!这里给大家提出一个小小问题,欢迎解答!
如果你觉得这篇文档对你有帮助,那就点个赞吧!希望写更好的文章和大家分享!