mysql通过mysqldump+binlog备份恢复&mysql5.7.10安装恢复

mysqldump备份脚本范例

#!/bin/sh
DATE1=`date +%Y%m%d%H%M`
DATABASE=glm_ec
BACKUP=/data/backup
/usr/local/mysql/bin/mysqldump -uroot -h 127.0.0.1 -R –single-transaction –master-data=2 库名 |gzip > $BACKUP/$DATABASE`date +%Y%m%d%H%M`.sql.gz

其中有两个参数: –single-transaction –master-data=2,

master-data,将会输出change master命令到导出文件里,值2以备注信息输出到文件里。single-transaction会发起一个读锁,保证当前备份时数据一致性,同时不影响备份时的更新操作,不影响系统的正常运行。库里有多个表,不设置这些参数,在导出时每个表导出的时间点不一样,在binlog里的位置也就不一致,这样在结合binlog文件恢复时,会有很多同步点,这是无法进行操作的。

有了这个唯一的恢复点,结合binlog通过mysqlbinlog命令很容易恢复数据,恢复过程略

分割线

—————————————————————————————–

通过ibdata1以及数据目录(idb以及frm)恢复

前面通过mysqldump+binlog恢复的方法是可行的,但是数据量大的时候,耗时非常长,实际环境数据目录+ibdata1文件超过200G,导sql文件就要十几个小时,速度太慢,因此有另外一种恢复方法,备份数据目录文件和ibdata1文件,通过一个目录和文件来恢复,这种方法优点是快,缺点是备份时需要停机。

恢复过程:

1、停掉要恢复机的mysql,备份ibdata1以及数据目录

2、将ibdata1以及数据目录移到要恢复机,修改移过来文件及目录权限

3、启动恢复机的mysql,如果有异常,还原步骤1备份的文件恢复

分割线

——————————————————————-

mysql5.7.10安装

mysql5.6和5.7的系统库(mysql库)差异非常大,上面第二种ibdata1+数据目录恢复的方案只能用在同版本数据库,本次遇到的情况是需要将mysql5.7备份的文件恢复到mysql5.6版本,经过实操证明这是不可行的,只有先升级mysql版本。

1、下载带有boost版本的community 版 mysql5.7(mysql.com 寻找要下版本的source code版,带boost的一般是最后一个,文件名里有boost),不带boost版本在安装时实际上还是要在线下载boost,会非常慢

2、CMAKE,要带上boost参数并制定路径,否则在后面make时会报错

3、make & make install

安装过程和其他版本差异不大,略

4、初始系统库,这步要人工操作,/usr/local/mysql/bin/mysqld –initialize –user=mysql

5、按照 恢复2操作,恢复并启动mysql

编译php5.6时报undefined reference to libiconv

config后编辑Makefile,在最后加上 -liconv,如下,再make make install

EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2-lz -lm -lcrypt -liconv

mysql5.7多主一从,从机调优

多主一从架构见前面文章,本文略。

同步了三个库到一台从机后,发现有两个库延时特别严重,且与主库延迟时间越拉越长,查看延迟时间,用show slave status;看Seconds_Behind_Master的值。

为了查找原因,准备开启慢日志,发现mysql从5.6开始慢日志配置项就改了,新的配置项有这么几个:

long_query_time=2
slow_query_log = 1
slow_query_log_file=/xx/xx/slow.log

配置好重启后,发现slow.log是生成了,但是等了一段时间后,没有记录到一条慢sql,通过show processlist发现慢sql多的是,就是无记录,暂未解决这个问题。

没办法,只好用show processlist人工检查慢sql,逐条优化。

之前为了初始多台主服的数据,将导过来的从库挨个改成了myisam引擎,为了加快同步速度,又改回innodb,发现在mysql5.7版本下,innodb确实要比myisam快。

经过一段时间观察,优化了几个关键的慢sql,同步延迟终于改善

mysql5.7.10主从后续

主服mysql5.6.28,从服mysql5.7.10,其中主服是从5.5.15升级到5.6.28,升到5.6的原因上一篇已经说过了,都是uuid搞的鬼。

因为数据量庞大,用mysqldump导出sql再导入的办法不太可行,太慢,采用拷贝库文件的方法。

1、停掉主服,打包库目录和idata1,上传到从服。

2、备份从服的idata1文件,因为5.7的系统库默认引擎是innodb,不能简单覆盖idata1文件,然后再替换成从库的idata1文件。

3、从库解压主库传过来的库目录和idata1文件,重启从库,这时候系统库实际上是无法使用的,因为idata1文件被替换了。

4、将移过来的库,所有表引擎改成myisam,以释放idata1文件,然后恢复老的idata1文件,重启从服。

5、这个时候从库系统库也可以用了,移过来的库也ok了,唯一的问题是引擎全部变成myisam,这个不影响主从同步,如果是多主一从,还不能改回innodb,因为idata1文件只有一个,其他库移过来都会有冲突,也都要转成myisam引擎。

遇到的问题,datetime,timestamp等字段默认值,在mysql5.7版本里,不能设置成’0000-00-00’,必须设置成正确的时间范围,拿timestamp来说,如果时区设置是中国,最小默认时间戳是’1970-01-01 08:00:01’,注意那个1秒,少一秒都不行,所有设置了默认值,小于这个时间或者用触发器获取当前时间的,都要重新定义。

Spreadsheet Excel Reader调试问题

从http://sourceforge.net/projects/phpexcelreader/files/Spreadsheet_Excel_Reader/下载的example.php,无法调试,大致有以下几个问题

1、报Deprecated: Assigning the return value of new by reference is deprecated in D:\wamp\www\phpExcelReader\Excel\reader.php on line 262,这是因为php5.3后,new不需要&引用,去掉&就可以了

2、报Spreadsheet/Excel/Reader/OLERead.php文件不存在,直接改成oleread.inc,example如此粗心!!!

3、支持中文,需要改$data->setOutputEncoding(‘CP1251’);改成UTF-8或者GB2312,看你具体编码

4、示范的excel文件格式是坏的,自己重新搞一个excel吧,否则一直会报超时。