编译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

多主一从部分从库重新同步&从库常见异常处理

主机已经运行一段时间,从机重新配置,我们的主从架构是多主一从,从机已经有了其他主机正在同步,所有表都是innodb。

1、停掉主服务器

包括mysql服务,web服务,最主要的mysql服务器一定要关闭

2、  将主服务器ibdata1以及库文件夹整体打包

ibdata1压缩打包,数据库文件压缩打包(tar -zcvf dir_name.tar.gz  dir_name 注:dir_name为被打包的文件目录)

3、  主服务器开启bin-log(my.cnf里增加配置log-bin=mysql-bin),启动,记录binlog的文件初始位置,恢复主服务器环境(需要一个小时)

4、  把打包文件送到从服务器

rsync 例如:rsync ibdata1 10.10.12.xxx:/data 是将ibdata1 传送到10.10.12.xxx的data目录,这时会提示输入10.10.12.xxx的用户名和密码

5、  从服务器同步全部停掉(stop slave),web关掉,mysql服务关闭(service mysqld stop)

6、  备份从服务器ibdata1文件(重命名),当复制过来的数据库表引擎转换成myisam引擎后,可重新恢复此文件

7、  将主服务器打包的数据文件(第2部打包的文件),移到从服务器数据库数据目录(压缩的文件记得解压);复制过来的ibdata1要有读取和写入的权限

8、  将要同步的库(bala_ec)所有表全部转成myisam引擎,这时复制过来的ibdata1文件可以删除了

转化数据库表引擎的方法参考后面语句

9、  将第4部重命名的ibdata1恢复,这个时候恢复到从库原先的数据状态

10、              再把要同步的库所有表全部转成innodb引擎

11、              设置从服务器的从库配置,启动主从同步—命令2

12、              在从库中启动主从同步 start slave

 

附:

命令1

show master status;

记录master_log_file、master_log_pos

命令2

Change master to master_host=’10.10.12.yy’, master_user=’yyyyy’, master_password=’yyyyy’, master_log_file=’主服同步bin文件名’, master_log_pos=主服同步bin文件的位置 for channel “xxxxx”;

在从库启动主从同步

Start slave

查看从库状态

Show slave status [for channel “”]

改变数据库表引擎:

alter table `acl_level` engine=myisam;

查看数据库中所有的表示例:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘yyyy’;

查看数据库中表引擎为MyISAM的表示例:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘yyyy’ AND ENGINE = ‘MyISAM’;

把sql语句执行结果写入到文件

mysql -u root -p -e “use bala_ec;show table status” > /data/1.sql

从库常见异常处理

1、因idbdata1文件里有垃圾表结构,导致myisam无法转innodb,(报表已存在,重启后会在数据目录自动生成idb文件)

先删除表,再重建表

2、同样idbdata1里有垃圾表结构,导致truncate myisam表后表无法创建也无法删除,拷贝一个frm文件过来,然后再删除表,再重建表

3、从库无法启动,报当前主库日志文件当前位置的sql无法执行,在主机使用

mysqlbinlog –start-position=报出问题的位置 –stop-position=往后加几十行 -d 主库名 binlog文件名

看一下指定位置是什么语句,如果不是正常语句位置,可以过去,用change master往后跳到下一条语句的位置

 

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秒,少一秒都不行,所有设置了默认值,小于这个时间或者用触发器获取当前时间的,都要重新定义。

尝鲜mysql5.7.10以及多主一从

因数据统计的需要,要将多台服务器上的数据汇总到一台,mysql5.7支持多源同步,也就是多主一从设置。具体配置如下:

安装mysql5.7.10就不详述了,和5.6过程没什么区别,但是千万不要直接在5.6上升级,系统库里的很多表结构都不一样了,包括user表以及几个主从表。

主服设置,可以参考之前的文章http://www.hao535.com/archives/642,略,主服唯一的要求是至少5.6版本,原因是从服的5.7和主服通信时要取主服的uuid,之前版本只用serverid就可以了,5.6以下版本是取不到uuid的,所以至少要5.6版本才能和5.7版本做主从。

关键是从服设置,就是5.7.10版本这台,首先配置文件my.cnf

server-id=2 // 不要重复,虽然serverid不重要了,还是要设置
master_info_repository=TABLE// 包括下面的信息,默认是存文件的,多个主库放文件里会有冲突,所以必须要存表里
relay_log_info_repository=TABLE

然后就是在mysql命令行里配置连接主服的参数,这些参数会写入到上面配置文件里指定的表里

change master to master_host=’主服ip’, master_user=’主服同步账号’, master_password=’同步账号密码’, master_log_file=’主服同步bin文件名’, master_log_pos=主服同步bin文件的位置 for channel “一个不重复的名称”;

这里有个很关键的东西for channel “xxx”,这个就是用来设置不同的主服,给每个主服都要命名,接下来启动从服,也要指定这个名称。

启动从服

start slave for channel “xxx”

查看从服状态

show slave status for channel “xxx”

配置多个主服,只要重复执行change master to 就可以了

 

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吧,否则一直会报超时。