MySQL-5.7.10主主同步的安装和配置

2018-01-11 13:00:43来源:oschina作者:linjin200人点击

分享
MySQL-5.7.10主主同步的安装和配置

原创2016年02月16日 13:04:01

2116 目录

目录 1


1.安装 1


2.修改MySQL的root密码4


3.mysqld_safe和mysql.server4


4.主主同步配置 4


4.1.创建同步用户 4


4.2.my.cnf 5


4.3.配置项说明 5


4.4.设置同步关系 6


4.5.验证 7


5.常见错误 7

1.安装

这里安装的是最新的MySQL5.7.10(5.7.12、5.7.13(后续更新版本可能类似)有些区别,安装过程中遇到错误可搜索下本文,也许可以找到解决办法),下载网址为:http://dev.mysql.com/downloads/mysql/。


本文选择是的“Linux-Generic”下的“Linux-Generic(glibc2.5)(x86,64-bit),CompressedTARArchive”,它的二进制安装包名为mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz。


将MySQL二进制安装包解压后,可看到名为INSTALL-BINARY(注意5.7.12版本INSTALL-BIARY文件位于docs目录下,而不是根目录)的文件,该文件有说明如何安装MySQL,本文基本参照它进行的。


由于官方提供的二进制安装包,编译的时候指定的“--prefix”为“/usr/local/mysql”,所以强烈建议将mysql安装在/usr/local目录下,否则安装过程会容易遇到问题。但同时建议将数据目录指定为一个足够大的分区下的目录。


当然,data目录也可以为软链接方式到足够大的分区目录,并且推荐使用软链接方式。否则在使用mysql命令时,经常需要指定参数“--datadir”,比如mysqld、mysqld_safe和mysql_ssl_rsa_setup等都需要指定“--datadir”。


如果不是安装在/usr/local/mysql,则需要为mysqld指定--basedir、--character-sets-dir、--language、--lc-messages-dir、--plugin-dir等众多参数值。


如果不能root用户安装,则还需要为mysqld指定--slow-query-log-file、--socket、--pid-file、--plugin-dir和--general-log-file等参数值。


这些参数的默认值,都可以通过执行MySQL的“bin/mysqld--verbose--help”查看到。



#MySQL安装目录为/usr/local/mysql,数据目录实际为/data/mysql/data

#注意需以root用户安装MySQL,如果不能root用户安装,容易遇到安装麻烦

#并请注意5.7.6之前的版本安装略有不同!

#新建mysql用户组

groupaddmysql

#新建mysql用户,并设置为不能作为linux登录用户

useradd-r-gmysql-s/bin/falsemysql

#进入到mysql安装目录

cd/usr/local

#解压二进制安装包

tarxzfmysql-5.7.10-linux-glibc2.5-x86_64.tar.gz

#建立易记的、与版本无关的短链接

ln-smysql-5.7.10-linux-glibc2.5-x86_64mysql

#进入到mysql目录

cdmysql

#创建数据目录

mkdir-p/data/mysql/data

#建立数据目录软链接,让指向/usr/local/mysql/data指向/data/mysql/data

#mysql-5.7.12默认的数据目录为/var/lib/mysql,

#而不是默认的/usr/local/mysql/data,请安装的时候注意,

#但mysql-5.7.13却又是/usr/local/mysql/data

ln-s/data/mysql/data/usr/local/mysql/data

#对于mysql-5.7.12(不包含mysql-5.7.13),应当如下:

#ln-s/data/mysql/data/var/lib/mysql

#创建mysqld_safe日志文件mariadb.log目录(mysql-5.7.12要求,mysql-5.7.10不需要)

#mysqld的错误日志文件默认位于data目录下,日志文件名为机器名,后缀为“.err”,

#如果mysqld启动不了,可以检查这两个日志文件,以找到解决办法。

mkdir/var/log/mariadb

#创建mysqld的pid文件mariadb.pid目录(mysql-5.7.12要求,mysql-5.7.10不需要)

mkdir/var/run/mariadb

#设置目录权限

chmod770/data/mysql/data

chown-Rmysql/data/mysql/data

chgrp-Rmysql/data/mysql/data

chown-Rmysql.

chgrp-Rmysql.

#下列4条mysql-5.7.12要求,mysql-5.7.10不需要

chmod770/var/log/mariadb

chmod770/var/run/mariadb

chown-Rmysql/var/log/mariadb

chgrp-Rmysql/var/run/mariadb

#初始化(成功执行完mysqld后,会提供一个临时的root密码,请务必记住)

#另外需要注意临时密码会过期,所以需要尽量修改root密码

#但如果指定参数–initial-insecure,则帐号[email protected]的密码为空

bin/mysqld--initialize--user=mysql--explicit_defaults_for_timestamp

#安装和配置SSL

bin/mysql_ssl_rsa_setup

#重置目录权限

chown-Rroot.

chown-Rmysql/data/mysql/data

#修改/etc/profile中的环境变量PATH

#将MySQL的bin目录加入到PATH的最前面

exportPATH=/usr/local/mysql/bin:$PATH

#启动mysql,请不要使用“bin/mysqld_safe--user=mysql&”来启动MySQL

#原因是5.7.12和5.7.10等版本的参数值不一致。

#使用“bin/mysqld_safe--user=mysql&”启动MySQL,将不能使用5.7.12版本mysql.server来停止MySQL,故推荐使用mysql.server来启动MySQL,由mysql.server间接调用mysqld

support-files/mysql.serverstart

#如果mysql.server不能正常停止MySQL,请往后查看解决办法

#查看端口是否已起来(不修改配置和不指定参数--port,默认端口号为3306)

netstat-lpnt|grep3306

#停止MySQL

support-files/mysql.serverstop

#设置mysql随着系统自启动

cpsupport-files/mysql.server/etc/init.d/mysql.server




以上使用的都是MySQL默认配置,如果需要定制化,可以通过修改文件my.cnf来达成。MySQL5.7.10不带my.cnf,只有个support-files/my-default.cnf。


通过执行命令“support-files/my-default.cnf”,可以了解到MySQL搜索my.cnf的顺序依次为:/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/etc/my.cnf~/.my.cnf,这样可以复制一份my-default.cnf,然后再修改,如:cpsupport-files/my-default.cnf/etc/my.cnf。


2.修改MySQL的root密码

由于上一步生成的是root临时密码,因此需要修改,以防过期不能使用。使用临时密码进入MySQLCli,以设置正式密码(注意保持mysql要和mysqld版本相同,否则可能会遇到“Yourpasswordhasexpired”错误,简便的做法是修改环境变量PATH,让新版的mysql位于老版本mysql的搜索路径之前,比如exportPATH=/usr/local/mysql/bin:$PATH):


SETPASSWORDFOR'root'@'localhost'=PASSWORD('new_password');


并建议使用单引号括起密码,使用双引号有转义问题!示例:


mysql-uroot-h127.0.0.1-p'8d#uhJdf(:Y<',其中'8d#uhJdf(:Y<'为临时密码。


3.mysqld_safe和mysql.server

mysql.server会调用mysqld_safe,两者都可以用来启动MySQL,但停止和重启只有mysql.server具备。Mysql.server通过读取pid文件来停止MySQL,pid文件默认位于data目录,但可以通过命令行参数pid-file来修改。


可以为mysqld_safe指定参数--user,来确定运行mysqld的运行用户,如果不指定的话,默认为mysql(由mysqld_safe文件中的变量user指定)。


以root执行msyqld_safe或mysql.server启动mysqld时,mysqld会自动切换到--user指定的用户,如mysql。通过psaux|grepmysqld,可以看到mysqld_safe运行在用户root下,而mysqld运行在用户mysql下。

如果使用mysql.server遇到错误:ERROR!MySQLserverPIDfilecouldnotbefound!,则是因为mysqld的--pid-file参数和mysql.server的不一致。


执行psaux|grepmysqld即可查看到mysqld的--pid-file参数值,或执行“mysqld--verbose--help”也可以查看到mysqld的--pid-file参数值:bin/mysqld--verbose--help|greppid-file。


简单的解决办法是修改mysql.server文件,搜索变量mysqld_pid_file_path(有些版本变量名为server_pid_file),并设置变量mysqld_pid_file_path的值和mysqld的--pid-file参数值相同即可。


对于mysql-5.7.13,mysql.server中的mysqld_pid_file_path默认值为$datadir/`hostname`.pid,而mysqld的--pid-file参数值为/var/lib/mysql/`hostname`.pid,两者不一致,将文件中的变量值修改成一致后即正常工作,如:mysqld_pid_file_path=/var/lib/mysql/`hostname`.pid。

如果启动不成功,又找不到出错日志信息,则可以考虑修改mysql.server,将:


$bindir/mysqld_safe--datadir="$datadir"--pid-file="$mysqld_pid_file_path"$other_args>/dev/null2>&1&


一行的重定向先注释掉,如:


$bindir/mysqld_safe--datadir="$datadir"--pid-file="$mysqld_pid_file_path"$other_args#>/dev/null2>&1&


以便可以在屏幕上观察到出错原因。


4.主主同步配置
4.1.创建同步用户

启动MySQL,然后进入MySQLCLi,执行以下命令创建用于同步的用户:



grantreplicationslave,fileon*.*to'user'@'peer'identifiedby'password';

flushprivileges;




其中user为用于同步的用户名,peer为另一主的IP地址,password为user的MySQL密码,这3个的值需根据实际进行修改。


注意,两主机器都需要创建同步用户。并确保peer为另一主的IP地址,其它user和password两主建议保持相同,示例(假设两主IP分别为192.168.1.1和192.168.1.2):


Ø192.168.1.1上执行:



grantreplicationslave,fileon*.*to'replication'@'192.168.1.2'identifiedby'123456';

flushprivileges;



Ø192.168.1.2上执行:



grantreplicationslave,fileon*.*to'replication'@'192.168.1.1'identifiedby'123456';

flushprivileges;



4.2.my.cnf

修改/etc/my.cnf,实现主主配置。


如果不存在/etc/my.cnf,则复制support-files/my-default.cnf生成my.cnf,两台机器的my.cnf分别配置为(不难看到,只有server_id和auto_increment_increment两项不同):



机器A


机器B




server-id=1

user=mysql

log-bin=mysql-bin

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=1

auto_increment_offset=1


server-id=2

user=mysql

log-bin=mysql-bin

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=2

auto_increment_offset=1



4.3.配置项说明

配置项


配置项说明




server-id


不能相同!唯一标识号,值位于1~2^32-1之间




user


这个可以不指定,则使用mysqld_safe指定的用户,或者mysqld_safe默认的用户mysql




log-bin


启用二进制日志文件




log-slave-updates


配置从库上的更新操作是否写二进制文件,需要和log-bin一起使用




slave-skip-errors


值为all表示让从库跳过所有错误(但不能跳过所有DDL所引起的主从错误),也可以只跳过指定的错误,如:--slave-skip-errors=1062,1053;也可以配置只跳过DDL错误,如:--slave-skip-errors=ddl_exist_errors,这等同于:

--slave-skip-errors=1007,1008,1050,1051,1054,1060,1061,1068,1094,1146




sync_binlog


值为1表示主机每次提交事务的时候把二进制日志的内容同步到磁盘上




auto_increment_increment

auto_increment_offset


和auto_increment_offset一起用于主主同步,用来错开自增,防止键值冲突,所以auto_increment_increment和auto_increment_offset两者,至少要有一项值不同。




上述配置会导致同步所有的数据库,借助下列配置项也可以选择性的同步或不同步:



配置项


配置项说明




binlog-do-db=test1

binlog-do-db=test2


表示只同步数据库test1和test2,如果还想同步test3,只需要新增一行:binlog-do-db=test3即可




binlog-ignore-db=db1

binlog-ignore-db=db2


表示不同步数据库db1和db2,如果还有db3不想同步,新增一行:binlog-ignore-db=db3即可




相关配置项(对于主从同步,只需要在从上配置):replicate-do-db、replicate-ignore-db、replicate_wild_do_table和replicate_wild_ignore_table。


4.4.设置同步关系

分别重启MySQL,进入MySQLCli,执行命令“showmasterstatus/G”,记住“File”和“Position”的值,如:



mysql>showmasterstatus/G

***************************1.row***************************

File:mysql-bin.000004

Position:682

Binlog_Do_DB:test

Binlog_Ignore_DB:mysql

Executed_Gtid_Set:

1rowinset(0.00sec)




设置同步关系(两个主都需要设置):



stopslave;

changemastertomaster_host='peer',master_user='user',master_password='password',master_log_file='mysql-bin.000004',master_log_pos=682;




如果不先执行“stopslave;”,则可能遇到如下错误:



ERROR3021(HY000):Thisoperationcannotbeperformedwitharunningslaveiothread;runSTOPSLAVEIO_THREADFORCHANNEL''first.




这里,peer、user和password三者的取值为“创建同步用户”时指定的值。设置示例:



changemastertomaster_host='192.168.1.2',master_user='replication',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=682;




由于前面一步调用“stopslave;”,停止了复制。在完成后,需再启动复制:



startslave;




4.5.验证

执行命令“showslavestatus/G;”查看复制状态,如果出现“Slave_IO_Running:Yes”和“Slave_SQL_Running:Yes”,则表示状态正常。


进一步,可以分别创建一个表,如:createtabletest1(aint)和createtabletest2(bint)。再分别使用showtables查看是否同步过去。


5.常见错误

1)ERROR1862(HY000):Yourpasswordhasexpired.Tologinyoumustchangeitusingaclientthatsupportsexpiredpasswords.


遇到这个问题,可能是因为客户端mysql和服务端版本不一致,比如mysql-5.5.41连接5.7.12。


2)TIMESTAMPwithimplicitDEFAULTvalueisdeprecated


执行MySQL的“bin/mysqld--initialize--user=mysql”时报的错误。


原因是从MySQL5.6版本开始,timestamp的默认值已被标为deprecated,即如果类型为timestamp的字段,如果没有明确声明默认值为NULL,则默认为NOTNULL。如果设置timestamp字段为NULL,则自动存储当前的timestamp。


3)Can'tfinderror-messagefile'/usr/local/mysql/share/errmsg.sys'


执行MySQL的“bin/mysqld--initialize--user=mysql--explicit_defaults_for_timestamp”时报的错误。


这可能是因为之前有执行过,导致data目录不为空,通过“bin/mysqld--verbose--help|grepdatadir”可以查看到默认的数据目录为/var/lib/mysql/。需要保证/var/lib/mysql/目录为空。或者通过指定参数--datadir改变数据目录,如“bin/mysqld--initialize--user=mysql--explicit_defaults_for_timestamp--datadir=/data/mysql/data”。


4)Can'tfinderror-messagefile'/usr/local/mysql/share/errmsg.sys'


对于错误:


Can'tfinderror-messagefile'/usr/local/mysql/share/errmsg.sys'.Checkerror-messagefilelocationand'lc-messages-dir'configurationdirective.


从官网下载的MySQL默认安装目录为/usr/local/mysql,如果实际为其它目录,则建议通过参数--basedir指定,否则会遇到不少安装问题。通过执行“bin/mysqld--verbose--help|grepbasedir”即可看到“--basedir”的默认值为/usr/local/mysql/。


5)Can'tconnecttolocalMySQLserverthroughsocket


使用mysql试图进入MySQLCli时,遇到错误:


ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/var/lib/mysql/mysql.sock'(2)


可能是因为客户端的版本和服务端的版本不一致,如果是这样,通常不存在/var/lib/mysql/mysql.sock。可以修改环境变量PATH来解决,让新安装的MySQL的bin目录位于PATH前头,如:


exportMYSQL_HOME=/usr/local/mysql


exportPATH=$MYSQL_HOME/bin:$PATH


exportMANPATH=$MYSQL_HOME/man:$MANPATH


6)ERROR3021(HY000):Thisoperationcannotbeperformedwitharunningslaveiothread;runSTOPSLAVEIO_THREADFORCHANNEL''first.


在设置同步关系时,没有先停止slaves线程。解决办法为在设置同步关系之前,先执行下“stopslave”,以停止slave线程。


7)ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)


执行mysql时报的错,是由于服务端mysqld和客户端mysql两者的mysql.sock文件位置不同。


解决办法:


使用“psaux|grepmysqld”或“cat"/proc/`pidofmysqld`/cmdline"”查看mysqld参数“--socket”的值,比如可能是“/var/lib/mysql/mysql.sock”。


显然不是mysql要找的“/tmp/mysql.sock”,指定下mysql的参数“-S”即可解决问题,如:mysql-S/var/lib/mysql/mysql.sock-uroot-p(坑爹的MySQL-5.7.12,默认参数各种不一致)。


8)mysqld:Table'mysql.plugin'doesn'texist


2016-05-18T03:33:56.235882Z0[ERROR]Can'topenthemysql.plugintable.Pleaserunmysql_upgradetocreateit.


可以使用“bin/mysqld--initialize--user=mysql--explicit_defaults_for_timestamp”重做下初始化,即可解决。

9)2016-05-18T03:41:02.970764Z0[ERROR]Fatalerror:Can'topenandlockprivilegetables:Table'mysql.user'doesn'texist


办法同上。


10)2016-05-18T03:44:42.731483Z0[ERROR]--initializespecifiedbutthedatadirectoryhasfilesinit.Aborting.


执行“bin/mysqld--initialize--user=mysql--explicit_defaults_for_timestamp”时报的错误,解决办法是清空data目录后再执行。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台