阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

173次阅读
没有评论

共计 7288 个字符,预计需要花费 19 分钟才能阅读完成。

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 线程。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-04/143018.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计7288字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中