单机多实例-主从同步复制尝试

【背景】

一直想试试单机多实例,玩下MySQL的主从复制;之前偶尔也研究过,由于各种原因,种种失败;
今天偶得闲暇,再次尝试,没想到还挺顺利的,谢谢网上的各位大牛,终于如常所愿,装逼了一把;

【前提准备】

  • 下载MySQL(原先一大拦路虎是编译MySQL,今天发现可以不用编译的,下载编译后的版本即可)下载传递门;

  • 按照参考1中的步骤,一步一步下来,参考1中,将MySQL放在了/tmp目录下,不是很喜欢,做了调整,放在了~/Dev/mysql;
    我这里的目录安排是:


    图1.png

    与参考1的区别是:

    • 新建了mysql_multi目录,存放data_3307,data_3308(系统自带的MySQL运行在3306,在此端口号顺移一个)而且运行时的sock文件也放在对应的data下面,后文将会看到;
    • 新建了logs目录,喜欢将各自的应用的logs放在自己的目录下,方便查找;
  • conf的配置
    3307配置,存放位置conf/3307.cnf
    因为是需要尝试主从复制,所以,主从复制的配置也可以体现

[client]
default-character-set=utf8    #客户端连接编码

[mysql]
auto-rehash                   #客户端tab补全
default-character-set=utf8    #编码

[mysqld]
user=mysql                    #运行账户
port=3307                     #定义端口
log-bin=mysql-bin             #开启二进制日志
server-id=001                 #定义服务ID

max_allowed_packet=50M        ###最大
wait_timeout=3600             ###等待超时默认s 
interactive_timeout=3600      ###活动超时

innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

# 主从复制相关配置
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

basedir=/home/www/Dev/mysql/mysql_multi                 #MYSQL根目录
datadir=/home/www/Dev/mysql/mysql_multi/data_3307       #MYSQL数据存放目录
socket=/home/www/Dev/mysql/mysql_multi/data_3307/3307_mysql.sock              #套接字

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8                #定义数据库默认字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names = 0             #对表的大小写不敏感

[mysqld_safe]
log-error=/home/www/Dev/mysql/logs/3307_err.log              #错误日志
pid-file=/home/www/Dev/mysql/mysql_multi/data_3307/mysqld.pid   #pid,多协议通信 tcp/sock

类似的,3308配置,存放位置 conf/3308.cnf

[client]
default-character-set=utf8    #客户端连接编码

[mysql]
auto-rehash                   #客户端tab补全
default-character-set=utf8    #编码

[mysqld]
user=mysql
port=3308                     #定义端口
log-bin=mysql-bin             #开启二进制日志
server-id=011                 #定义服务ID

max_allowed_packet=50M        ###最大
wait_timeout=3600             ###等待超时默认s 
interactive_timeout=3600      ###活动超时

innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

# 主从复制相关
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程) 
read_only=1

basedir=/home/www/Dev/mysql/mysql_multi                 #MYSQL根目录
datadir=/home/www/Dev/mysql/mysql_multi/data_3308       #MYSQL数据存放目录
socket=/home/www/Dev/mysql/mysql_multi/data_3308/3308_mysql.sock              #套接字

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8                #定义数据库默认字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

symbolic-links=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names = 0             #对表的大小写不敏感

[mysqld_safe]
log-error=/home/www/Dev/mysql/logs/3308_err.log              #错误日志
pid-file=/home/www/Dev/mysql/mysql_multi/data_3308/mysqld.pid   #pid,多协议通信 tcp/sock
  • 初始化数据库
    (可能参考1配置的版本比较老,提示./scripts/mysql_install_db方式不可取)
./bin/mysqld --defaults-file=conf/3307.cnf --user=www --initialize --basedir=/home/www/Dev/mysql --datadir=/home/www/Dev/mysql/mysql_multi/data_3307
./bin/mysqld --defaults-file=conf/3308.cnf --user=www --initialize --basedir=/home/www/Dev/mysql --datadir=/home/www/Dev/mysql/mysql_multi/data_3308

从启动中也可以看到,具体的目录、配置的存放位置了;需要注意的是,--defaults-file参数需要紧跟着./bin/mysqld,刚开始随意放了个位置,居然提示 不认识这个选项

  • 启动数据库
./bin/mysqld_safe --defaults-file=conf/3307.cnf &
./bin/mysqld_safe --defaults-file=conf/3308.cnf &

首次启动后的日志文件中,最后一行包含了临时root用户的密码,这个需要保持下来,例如:

A temporary password is generated for root@localhost: dhtiYkKwt4&O 

既然启动了,就连接试试看呗

./bin/mysql -S /home/www/Dev/mysql/mysql_multi/data_3307/3307_mysql.sock -P 3307 -u root -p

使用启动时的临时密码登录;
在随后的show databases时,报错:
ERROR 1820(HY000) Unknown error 1820
百度了下,需要设置密码SET PASSWORD=PASSWORD('mima'),就可以了。

图2.png

此时参考1中的设置密码一步就不再需要了

至此,单机多实例就算完成,之后,配置主从同步

  • 新建同步的账号
# 在3307上新建同步的账号,让3308同步3307的改变
create user 'sync'@'localhost' identified by 'sync';
  • 对同步的账号授权可以同步的权利
grant replication slave on *.* to 'sync'@'localhost' identified by 'sync';
  • 查看主库的状态


    图3.png
  • 切换到从库(3308),让3308同步3307

change master to master_host='localhost', master_port=3307, master_user='sync', master_password='sync', master_log_file='mysql-bin.000003', master_log_pos=154;

看到如此随意的change master to .... 开始怀疑参考1的严肃性,查看了其他的博客,发现也是这样,那就试试了,还真是的,执行没报错的话,show slave status 是这样

图4.png

此时还没开启同步;

  • 开启同步
# 开启同步 
start  slave; 
# 停止从主机  
stop slave;

开启后,show slave status展示的上图飘红部分是YES,例如:

图5.png

  • 随后在主库上新建个库,创建表,写入几个数据看看;
# 新建数据库`webdb`
create databases webdb;

# 新建测试数据表 t
create table t(`a` int, `b` int);

# 写入一行数据
insert into t set a=1,b=2; 

查看从库的同步


图6.png

此时,可以查看主库的show master status和从库的show slave status,其中的position是一致的,也就是主从没有延迟;

图7.png

图8.png

【参考书】
1、https://www.cnblogs.com/xiaochina/p/6886115.html
2、http://www.raye.wang/2017/04/14/mysqlzhu-cong-fu-zhi-da-jian-ji-yu-ri-zhi-binlog
3、https://www.jianshu.com/p/63c1a1babfd1

你可能感兴趣的:(单机多实例-主从同步复制尝试)