在同一台机器上启动两个mysql并启动主从

前言

首先机器上已经有了一台mysql服务,找到mysql的安装位置复制一份。

主数据库修改

修改my.cnf

将/etc/my.cnf修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[mysql]

# 设置mysql客户端默认字符集
#
default-character-set=utf8
#
[mysqld]
#
skip-name-resolve
#
# #设置3307端口
#
port = 3307

#设置socket文件位置(重点)
socket=/usr/local/mysql/data/mysql.sock
#设置mysqlx socket文件位置(重点)
mysqlx_socket=/usr/local/mysql/data/mysqlx.sock
#设置mysqlx 的端口(重点)
mysqlx_port = 33060
#设置默认密码的加密方式,只会影响新增密码或者修改密码
default_authentication_plugin=mysql_native_password
#设置server_id,和从数据库不一样就可以(重点)
server_id = 5


# # 设置mysql的安装目录
#
basedir=/usr/local/mysql
#
# # 设置mysql数据库的数据的存放目录
#
datadir=/usr/local/mysql/data
# # 允许最大连接数
max_connections=200
#
# # 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# # 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M

这样做的目的是指定端口和文件,防止和从数据库冲突,导致起不来

使用命令安全关闭mysql

1
./mysqladmin -uroot -p123456 shutdown

然后重新启动:

1
./mysqld_safe --defaults-file=/etc/my.cnf &

复制mysql

本机器mysql安装位置是:/usr/local/mysql,使用命令复制出来一份:

1
cp -R /usr/local/mysql /usr/local/mysql3308

然后修改文件夹所在组:

1
chown -R mysql:mysql /usr/local/mysql3308

最好修改下文件夹权限:

1
chmod -R 755 /usr/local/mysql3308

复制一份配置文件,默认配置文件在/etc/my.cnf

1
cp /etc/my.cnf /etc/my3308.cnf

编辑my3308.cnf,将内容改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

[mysql]

# 设置mysql客户端默认字符集
#
default-character-set=utf8

#
[mysqld]


#设置socket文件位置(重点)
socket=/usr/local/mysql3308/data/mysql.sock
#设置mysqlx socket文件位置(重点)
mysqlx_socket=/usr/local/mysql3308/data/mysqlx.sock
#设置mysqlx 的端口(重点)
mysqlx_port = 33070
#设置server_id,和主数据库不一样就可以(重点)
server_id = 18

#设置3308端口
port = 3308
#
default_authentication_plugin=mysql_native_password
# # 设置mysql的安装目录
#
basedir=/usr/local/mysql3308
#
# # 设置mysql数据库的数据的存放目录
#
datadir=/usr/local/mysql3308/data


# # 允许最大连接数
max_connections=200
#
# # 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# # 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M

初始化mysql

使用新的mysql程序初始化数据库

1
/usr/local/mysql3308/bin/mysqld --defaults-file=/etc/my3308.cnf  --initialize --user=mysql --basedir=/usr/local/mysql3308 --datadir=/usr/local/mysql3308/data

初始化之后,会提醒初始化成功,并提示初始化密码。

修改/usr/local/mysql3308/data/auto.cnf里面的值,将里面的uuid改一下,然后保存。

注意:要设置data目录所属用户为mysql

1
chown mysql.mysql -R ./data

这个时候还没有启动mysql,可以使用命令:

1
./mysqld_safe --defaults-file=/etc/my3308.cnf &

启动mysql报错,请看data下面err后缀的文件内容

查看是否启动成功:

1
ss -tnl

登录到主mysql

进入到主mysql:

1
./mysql -S /usr/local/mysql/data/mysql.sock -u root -p

创建数据库同步用户:(必须为IP地址,localhost连不上)

1
CREATE USER 'repl'@'123.57.44.85' IDENTIFIED BY 'slavepass';

授权:

1
2
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'123.57.44.85';
flush privileges;

登录到从mysql

进入到mysql3308/bin目录下,执行:

1
./mysql -S /usr/local/mysql3308/data/mysql.sock -u root -p

登录到mysql,修改原始密码。

因为我们只需要root本地登录,所以可以把密码改的简单点:

1
alter user 'root'@'localhost' identified by '123456';

设置mysql主从

需要同时登录主数据库和从数据库

主数据库

查询master状态:

1
show master status;

会显示:

1
2
3
4
5
6
7
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 2734 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

接下来就不要操作主mysql,防止状态值发生变化。(mysql不能有任何操作,不然Position会变化)

从数据库

执行

1
CHANGE MASTER TO MASTER_HOST='182.92.172.80',MASTER_USER='rep1',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=2734;

master_log_file为主mysql显示File,pos是Position。

开启slave:

1
start slave;

查看slave状态:

1
show slave status\G

主要看两个参数,一个是Slave_IO_Running,另一个是Slave_SQL_Running。两个都为yes,才代表mysql主从开启成功。

注意事项

如果想停止mysql,首先登录到从数据库,运行命令去停止主从复制:

1
stop slave;

然后再运行

1
CHANGE MASTER TO MASTER_HOST='182.92.172.80',MASTER_USER='rep1',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=2734;

再恢复同步

1
start slave;

如果出现问题,可以重置同步

首先去从数据库停止同步:

1
stop slave;

主数据库执行:

1
reset maseter;

从数据库执行:

1
reset slave;

然后看主数据库的master:

1
show master status;

根据状态在从数据库中运行:

1
CHANGE MASTER TO MASTER_HOST='182.92.172.80',MASTER_USER='rep1',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=2734;

然后在从数据库中开启同步:

1
start slave;

同步设置同步哪些数据库

在主数据库/etc/my.cnf中写:

1
2
3
4
5
6
7
# 不同步哪些数据库  
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema

# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game

评论