i):环境介绍:

1:主服务器 外网IP:199.0.0.1(不方便直接透漏实际IP,请自行替换),MySQL版本8.0.14,端口号:3306(默认);

2:从服务器 外网IP:199.0.0.2,MySQL版本8.0.14,端口号:3306;

ii):准备工作:

1:安装MySQL数据库,这里方法比较多,可以通过安装MySQL官网提供的最新apt.deb包,通过apt-get install mysql-server命令安装,这边尝试了多次,没有成功,提供的始终是MySQL5.7版本和MariDB10版本,所以这边使用的是下载最新安装包安装,这里走的弯路比较多,因为选择版本后看到的文件实在是多,而且不是一个安装包,需要根据一定的步骤安装,官方下载页面如下,需要登陆后才能下载,通过wget 下载速度不是很可观,我这边先下载到物理机,上传七牛云,然后wget 七牛外链,速度超快,如果阿里云服务器本身购买的外网速度较快,忽略,下载页面如下图:

找到如下图所示包,下载到服务器,然后解压,会得到下面所列的安装包合集,需要安装的包有七个,其他的可以删除,有需要的也可以安装,然后就是按照一定的顺序安装这些包,切不可乱了次序,如下所示:

第一个包是依赖包,先安装,其他的根据如下次序依次安装即可,注意版本号前面的名称即可,后期有变请自行摸索:

安装最后一步时会提示输入mysql的root密码,默认可空,之后设置,需要注意的是设置密码后会提示选择加密方式,因为新版本的数据库新加了更加安全的加密方式,所以若是修改寄存项目的密码比较麻烦,建议是选择5.7及以下的加密方式,或者在配置文件中添加参数如下:

default_authentication_plugin = mysql_native_password

,之后就可以一步步修改现存的项目请求数据库的方式,逐步破弃老的加密方式。

安装完之后先查看数据库是否已经跑起来了,

px -aux | grep mysql

若是发现mysqld进程,请先停止数据库,

service mysql stop

主从库都需要这一步操作。

接着就需要修改主从库mysql的配置文件,正常情况下数据库数据不会安装在默认路径下,所以需要修改三处文件内容,

第一处是:/etc/mysql/mysql.conf.d/mysqld.cnf,基础配置文件,下面说明;

第二处是:/etc/apparmor.d/usr.sbin.mysqld:

实际修改地方如下:

修改前:

# Allow data dir access

/var/lib/mysql/ r,

/var/lib/mysql/** rwk,

修改后:

/mysql/master/ r,

/mysql/master/** rwk,

/mysql/slave/ r,

/mysql/slave/** rwk,

在主库:

mkdir -p /mysql/master

chown mysql:mysql /mysql/master

在从库:

mkdir -p /mysql/slave

chown mysql:mysql /mysql/slave

默认的数据库数据是存放在/var/lib/mysql,需要修改至数据盘中,建议单独设置一盘,选用速度较高的ssd云盘,贵也值得,注释或者删除之前的路径都可以;

第三处是:/etc/apparmor.d/abstractions/mysql:

承接的上面的修改,如下所示,注释或删除之前的,然后添加新的路径:

修改前:

/var/lib/mysql{,d}/mysql{,d}.sock rw,

修改后:

/mysql/master{,d}/mysql{,d}.sock rw,

/mysql/slave{,d}/mysql{,d}.sock rw,

说明:二三处修改就是为了确保mysql对所属文件夹有完全的权限,具体可参考相关文档,此处不再说明。

配置mysql相关参数:

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /mysql/master

log-error = /var/log/mysql/error.log

slow_query_log = 1

slow_query_log_file = /var/log/mysql/slow.log

long_query_time = 10

log_queries_not_using_indexes = 1

max_connections = 200

# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统

max_connect_errors = 10

# 服务端使用的字符集默认为UTF8

character-set-server = UTF8MB4

# 创建新表时将使用的默认存储引擎

default-storage-engine = INNODB

# 默认使用“mysql_native_password”插件认证

default_authentication_plugin = mysql_native_password

# bin-log过期时间

binlog_expire_logs_seconds = 10800

#本服务器id

server-id = 1

# 设置mysql客户端默认字符集

default-character-set = UTF8MB4

# 设置mysql客户端连接服务端时默认使用的端口

port = 3306

default-character-set = UTF8MB4

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /mysql/slave

log-error = /var/log/mysql/error.log

slow_query_log = 1

slow_query_log_file = /var/log/mysql/slow.log

long_query_time = 10

log_queries_not_using_indexes = 1

max_connections = 200

# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统

max_connect_errors = 10

# 服务端使用的字符集默认为UTF8

character-set-server = UTF8MB4

# 创建新表时将使用的默认存储引擎

default-storage-engine = INNODB

# 默认使用“mysql_native_password”插件认证

default_authentication_plugin = mysql_native_password

# bin-log过期时间

binlog_expire_logs_seconds = 10800

#本服务器id

server-id = 2

# 设置mysql客户端默认字符集

default-character-set = UTF8MB4

# 设置mysql客户端连接服务端时默认使用的端口

port = 3306

default-character-set = UTF8MB4

iii):启动数据库

主从库都需要启动:

service mysql start

若是成功启动最好,若是启动失败,可查看错误日志,一般而言,错误主要基本都是上述二三步骤配置时有误,请对比检查即可,若是其他错误,请自行搜索资料解决。

启动成功后登录进入mysql:

若是安装时未设置密码,首次无密码即可进入,有密码的话使用如下:

mysql -u root -p

登陆进去后,对主从库设置本地root的密码,可使用

select host,user,plugin  from mysql.user;

mysql> select user,host,plugin from mysql.user;

+------------------+-----------+-----------------------+

| user             | host      | plugin                |

+------------------+-----------+-----------------------+

| mysql.infoschema | localhost | caching_sha2_password |

| mysql.session    | localhost | caching_sha2_password |

| mysql.sys        | localhost | caching_sha2_password |

| root             | localhost | mysql_native_password |

+------------------+-----------+-----------------------+

可以看到密码插件多个,mysql_native_password兼容5.7和以下,caching_sha2_password是新的加密插件,后期可以拓展使用,

修改或添加密码命令如下:

ALTER USER '修改的用户名'@'修改的登录主机' IDENTIFIED WITH mysql_native_password BY '你的密码';

比如修改新库本地root密码为root:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

刷新权限:

flush privileges;

提交即可,接下来就需要在主库添加复制用户,也就是从库用来从主库复制数据的账号密码,主从复制需要开启bin-log,作者这边测试时发现,8.0版本的数据库默认就是开启状态,配置文件可以不配置,但是可能需要设置bin-log的过期方式,不然日志累计起来,对空间消耗过大,根据实际业务需要设置,上边配置mysql的基础配置文件中

binlog_expire_logs_seconds

就是过期时间,默认秒为单位,根据实际设置过期时间,不详细说明。

主库上的操作:

新建复制账号,需要注意的是此处账号为明文,使用mysql_native_password会加密,且明文个数不超过32位,因为之后操作超过32位会报错,网上资料说此错已修复,作者这边操作时报错:

CREATE USER '复制账号名'@'从机ip' IDENTIFIED WITH mysql_native_password BY '密码';

给与账号复制权限, “*.*” 表示默认给与所有数据库的复制权限,也可以给与特定数据库的复制权限,有需要可自行去查阅资料:

GRANT REPLICATION SLAVE ON *.* TO '复制账号名'@'从机ip';

例如本次配置:

CREATE USER 'repl'@'199.0.0.2' IDENTIFIED WITH mysql_native_password BY 'repl';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'199.0.0.2';

flush privileges;

提交成功后,查看主库状态: show master status;

mysql> show master status;

+---------------+-----------+--------------+------------------+-------------------+

| File          | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+---------------+-----------+--------------+------------------+-------------------+

| binlog. | 100|              |                  |                   |

+---------------+-----------+--------------+------------------+-------------------+

需要记住file名和当前Position,这两个参数用来告诉从库从哪里的哪个地方开始同步记录,因为作者这边是空库,后期通过mysqldump得到的数据重新写库,所以只需要保证当前从库即可。

从库上操作:

首先使用  show slave status;  查看从库状态,对于新库什么都查不到,这就对了,若是有信息,请先停止stop slave;

设置从库的主库信息:

change master to master_host='主库ip',master_user='主库设置的复制账号',master_password='主库设置的密码',master_log_file='binlog名',master_log_pos=位置;

参数说明:

master_host:        主库的地址(ip或域名(保证可解析即可))

master_user:        主库上设置的复制账号,此处为上面设置的repl

master_password:  主库上设置的明文密码,有32位个数限制

master_log_file和master_log_pos: show master status展示的内容。

change master to master_host='199.0.0.1',master_user='repl',master_password='repl',master_log_file='binlog.',master_log_pos=100;

提交即可,有错误请查询资料解决。

设置完成后,使用 show slave status;查看得到如下信息:

Slave_IO_State    Waiting for master to send event

Slave_SQL_Running_State   Slave has read all relay log; waiting for more updates

表示成功了,可以在主库上测试一条数据,查看从库,若是写了,成功,若是有问题,请查询资料解决。

至此完工。