MySQL-5.7.10主主同步的安装和配置
1. 安装 1
2. 修改MySQL 的 root 密码 3
3. mysqld_safe和 mysql.server 3
4. 主主同步配置 3
4.1. 创建同步用户 3
4.2. my.cnf 4
4.3. 配置项说明 4
4.4. 设置同步关系 5
4.5. 验证 6
5. 常见错误 6
1. 安装
这里安装的是最新的MySQL 5.7.10,下载网址为:http://dev.mysql.com/downloads/mysql/ 。
本文选择是的“linux - Generic”下的“Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive”,它的二进制安装包名为mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz。
将MySQL二进制安装包解压后,可看到名为INSTALL-BINARY的文件,该文件有说明如何安装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用户组
groupadd mysql
# 新建mysql用户,并设置为不能作为linux登录用户
useradd -r -g mysql -s /bin/false mysql
# 进入到mysql安装目录
cd /usr/local
# 解压二进制安装包
tar xzf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz
# 建立易记的、与版本无关的短链接
ln -s mysql-5.7.10-linux-glibc2.5-x86_64 mysql
# 进入到mysql目录
cd mysql
# 创建数据目录
mkdir -p /data/mysql/data
# 建立数据目录软链接,让指向/usr/local/mysql/data指向/data/mysql/data
ln -s /data/mysql/data /usr/local/mysql/data
# 设置目录权限
chmod 770 /data/mysql/data
chown -R mysql /data/mysql/data
chgrp -R mysql /data/mysql/data
chown -R mysql .
chgrp -R mysql .
# 初始化(成功执行完mysqld后,会提供一个临时的root密码,请务必记住)
# 另外需要注意临时密码会过期,所以需要尽量修改root密码
# 进入MySQL Cli后,执行下列命令即可修改成新密码:
bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp
# 安装和配置SSL
bin/mysql_ssl_rsa_setup
# 重置目录权限
chown -R root .
chown -R mysql /data/mysql/data
# 启动mysql
bin/mysqld_safe --user=mysql &
# 查看端口是否已起来(不修改配置和不指定参数--port,默认端口号为3306)
netstat -lpnt|grep 3306
# 停止MySQL
support-files/mysql.server stop
# 设置mysql随着系统自启动
cp support-files/mysql.server /etc/init.d/mysql.server
以上使用的都是MySQL默认配置,如果需要定制化,可以通过修改文件my.cnf来达成。MySQL 5.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,然后再修改,如:cp support-files/my-default.cnf /etc/my.cnf。
2. 修改MySQL的root密码
由于上一步生成的是root临时密码,因此需要修改,以防过期不能使用。进入MySQL Cli后,执行下列命令进行修改:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
并建议使用单引号括起密码,使用双引号有转义问题!
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。通过ps aux|grep mysqld,可以看到mysqld_safe运行在用户root下,而mysqld运行在用户mysql下。
4. 主主同步配置
4.1. 创建同步用户
启动MySQL,然后进入MySQL CLi,执行以下命令创建用于同步的用户:
grant replication slave,file on *.* to 'user'@'peer' identified by 'password';
flush privileges;
其中user为用于同步的用户名,peer为另一主的IP地址,password为user的MySQL密码,这3个的值需根据实际进行修改。
注意,两主机器都需要创建同步用户。并确保peer为另一主的IP地址,其它user和password两主建议保持相同,示例(假设两主IP分别为192.168.1.1和192.168.1.2):
? 192.168.1.1上执行:
grant replication slave,file on *.* to 'replication'@'192.168.1.2' identified by '123456';
flush privileges;
? 192.168.1.2上执行:
grant replication slave,file on *.* to 'replication'@'192.168.1.1' identified by '123456';
flush privileges;
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,进入MySQL Cli,执行命令“show master status\G”,记住“File”和“Position”的值,如:
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 682
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
Executed_Gtid_Set:
1 row in set (0.00 sec)
设置同步关系(两个主都需要设置):
stop slave;
change master to master_host='peer',master_user='user',master_password='password',master_log_file='mysql-bin.000004', master_log_pos=682;
如果不先执行“stop slave;”,则可能遇到如下错误:
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
这里,peer、user和password三者的取值为“创建同步用户”时指定的值。设置示例:
change master to master_host='192.168.1.2',master_user='replication',master_password='123456',master_log_file='mysql-bin.000004', master_log_pos=682;
由于前面一步调用“stop slave;”,停止了复制。在完成后,需再启动复制:
start slave;
4.5. 验证
执行命令“show slave status\G;”查看复制状态,如果出现“Slave_IO_Running: Yes”和“Slave_SQL_Running: Yes”,则表示状态正常。
进一步,可以分别创建一个表,如:create table test1 (a int)和create table test2 (b int)。再分别使用show tables查看是否同步过去。
5. 常见错误
1) TIMESTAMP with implicit DEFAULT value is deprecated
执行MySQL的“bin/mysqld --initialize --user=mysql”时报的错误。
原因是从MySQL 5.6版本开始,timestamp的默认值已被标为deprecated,即如果类型为timestamp的字段,如果没有明确声明默认值为NULL,则默认为NOT NULL。如果设置timestamp字段为NULL,则自动存储当前的timestamp。
2) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'
执行MySQL的“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp”时报的错误。
这可能是因为之前有执行过,导致data目录不为空,通过“bin/mysqld --verbose --help|grep datadir”可以查看到默认的数据目录为/var/lib/mysql/。需要保证/var/lib/mysql/目录为空。或者通过指定参数--datadir改变数据目录,如“bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp --datadir=/data/mysql/data”。
3) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'
对于错误:
Can't find error-message file '/usr/local/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
从官网下载的MySQL默认安装目录为/usr/local/mysql,如果实际为其它目录,则建议通过参数--basedir指定,否则会遇到不少安装问题。通过执行“bin/mysqld --verbose --help|grep basedir”即可看到“--basedir”的默认值为/usr/local/mysql/。
4) Can't connect to local MySQL server through socket
使用mysql试图进入MySQL Cli时,遇到错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
可能是因为客户端的版本和服务端的版本不一致,如果是这样,通常不存在/var/lib/mysql/mysql.sock。可以修改环境变量PATH来解决,让新安装的MySQL的bin目录位于PATH前头,如:
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
export MANPATH=$MYSQL_HOME/man:$MANPATH
5) ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
在设置同步关系时,没有先停止slaves线程。解决办法为在设置同步关系之前,先执行下“stop slave”,以停止slave线程。