MySQL 主从搭建(同一台机器)

考虑到部分读者也在搞技术,特地把同一台机器搭建主从的笔记分享给大家。也希望能够帮到更多的人。


本次搭建在同一台机器上搭建,用不同用户和不同端口以及不同程序路径。安装过程比较简单,采用二进制的方式来做的。


主从复制原理:复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。

1)主服务器将所有数据和结构更改记录到二进制日志中。

2)从属服务器从主服务器请求该二进制日志并在本地应用其内容。

3)IO:请求主库,获取上一次执行过的新的事件,并存放到relaylog

4)SQL:从relaylog中将sql语句翻译给从库执行


主库搭建:

加入环境变量:

640?wx_fmt=png

 
 

export MYSQL_HOME=/opt/mysql
export PATH=$PATH:$MYSQL_HOME/bin

主库的配置文件:

 
 

[mysql]
no-auto-rehash
port = 3306
socket = /opt/data/mysqld.sock
[mysqld]
user = mysql
port = 3306
basedir = /opt/mysql
datadir = /opt/data
socket = /opt/data/mysqld.sock
pid-file = mysql.pid
character-set-server = utf8
skip_name_resolve = 1
lower_case_table_names=1
max_connections = 1000
max_connect_errors = 1000000
table_open_cache = 4000
table_definition_cache = 4000
table_open_cache_instances = 64
max_allowed_packet = 32M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 450
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 96M
max_heap_table_size = 96M
general_log=1
general_log_file=general.log
slow_query_log = 1
slow_query_log_file = /opt/log/slow.log
log_error = /opt/log/error.log
long_query_time =1
server-id = 170
log_bin = mysql-bin
log_slave_updates=on
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_format = row
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 16M
lock_wait_timeout = 3600
innodb_thread_concurrency = 0
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3


但是当启动主库的时候有这个错误:

640?wx_fmt=png

更新不了pid查看错误日志,如图:

640?wx_fmt=png

原因是配置参数的问题,自动扩展配置参数设置的太大导致,将其改小或者注释解决。

640?wx_fmt=png

 
 

主库初始化:mysqld --initialize --user=mysql --datadir=/opt/data --basedir=/opt/mysql --socket=/opt/data/mysqld.sock


需要注意的是:MySQL在5.6以及以下版本和5.7之后初始化的时候用的命令是不同的。需要仔细看下面命令的区别。


bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data # Before MySQL 5.6

bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data # MySQL 5.7 and up


初始化主库后启动mysql服务进行登录,必须要先修改密码:

 
 

ALTER USER "root"@"localhost" IDENTIFIED BY "shsnc!@#";
flush privileges;

640?wx_fmt=png

 
 

登录主库创建主从同步用户:
create user 'tigergao' identified by 'tigergao';

640?wx_fmt=png

 
 

赋权:grant replication slave on *.* to tigergao@'10.131.156.%' identified by 'tigergao';

640?wx_fmt=png

记录主库binlog位置:

640?wx_fmt=png

主库配置完毕,需要进行配置从库。

注意:由于我是在同一台机子上做的主从,主库采用的做了软链后用service mysql start的方式启动的,由于担心同时做软链会发生冲突,所以从库用命令的方式启动的。




从库搭建:

加入环境变量:

640?wx_fmt=png

 
 

export MYSQL_HOME=/data/mysql
export PATH=$PATH:$MYSQL_HOME/bin

 
 

从库的配置:
[mysql]
no-auto-rehash
port = 3309
socket = /data/data/mysqldbs.sock
[mysqld]
user = mysql01
port = 3309
basedir = /data/mysql
datadir = /data/data
socket = /data/data/mysqldbs.sock
pid-file = mysqldbs.pid
character-set-server = utf8
skip_name_resolve = 1
lower_case_table_names=1
max_connections = 1000
max_connect_errors = 1000000
table_open_cache = 4000
table_definition_cache = 4000
table_open_cache_instances = 64
max_allowed_packet = 32M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 450
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 96M
max_heap_table_size = 96M
general_log=1
general_log_file=general.log
slow_query_log = 1
slow_query_log_file = /data/log/slow.log
log_error = /data/log/error.log
long_query_time =1
server-id = 175
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log_slave_updates=on
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_format = row
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 16M
lock_wait_timeout = 3600
innodb_thread_concurrency = 0
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3

注意:由于在同一台机器搭建,主库的服务已经做了软连接,为避免冲突,从库采用命令方式启动而不是直接采用service start 的方式去启动。

 
 

/data/mysql/bin/mysqld_safe --defaults-extra-file=/data/mysql/conf/my.cnf --datadir=/data/data --basedir=/data/mysql --user=mysql01 &

640?wx_fmt=png

查看进程:可以看到主库的 3306 和 从库的 3309 的两个端口都已经起来了。代表主库和从库的进程都已经启动起来了。

 
 

ps -ef | grep -v grep | grep -i mysql

640?wx_fmt=png




接下来需要进行设置主从关系,这一步异常很关键。

设置主从:需要在从库上执行

 
 

change master to master_host='主库ip';
change master to master_port=3306;
change master to msater_user='tigergao';
change master to master_password='tigergao';
change master to master_log_file='mysql-bin.000001';
change master to master_log_pos=1097;
开启主从:startslave

640?wx_fmt=png640?wx_fmt=png

在从库上查看sql线程和io线程是否成功应用,如果已应用代表就是成功了。

 
 

show slave status \G;

640?wx_fmt=png




接下来进行验证主从,查看数据是否进行同步


在主库上创建数据库:tigergao;在数据库tigergao中创建一张学生表并插入数据。

640?wx_fmt=png

640?wx_fmt=png

然后登陆从库进行查看数据库和表以及数据是否过来。

640?wx_fmt=png

640?wx_fmt=png

主库数据目录:

640?wx_fmt=png

从库数据目录:

640?wx_fmt=png


此时在查看主库的binlog,写入数据后主库的binlog的位置会开始改变;此时 binlog 位置变成了 1268。

640?wx_fmt=png

查看从库,是否同步。

640?wx_fmt=png

主从已经搭建成功。




主从问题一般处理:

 
 

主从复制基本故障处理
IO线程
++ 连接主库 ++
1)user password ip port
2)网络:不通,延时高,防火墙
++ 请求binlog ++
1)binlog不存在或者损坏
++ 更新relay-log和master.info ++
SQL线程
1)relay-log出现问题
2)从库做写入了
操作对象已存在(create)
操作对象不存在(insert update delete drop truncate alter)
约束问题、数据类型、列属性
处理方法一:
#临时停止同步
mysql> stop slave;
#将同步指针向下移动一个(可重复操作)
mysql> set global sql_slave_skip_counter=1;
#开启同步
mysql> start slave;
处理方法二:
#编辑配置文件
vim /etc/my.cnf
#在[mysqld]标签下添加以下参数
slave-skip-errors=1032,1062,1007
但是以上操作都是有风险存在的
处理方法三:
1)重新备份数据库,恢复到从库
2)给从库设置为只读
#在命令行临时设置
mysql> set global read_only=1;
#在配置文件中永久生效/etc/my.cnf
read_only=1
6.延时从库
企业中一般会延时3-6小时
延时从库配置方法
从库操作
#停止主从
mysql>stop slave;
#设置延时为180秒
mysql>change master to master_delay = 180;
#开启主从
mysql>start slave;
#查看状态
mysql> show slave status \G
SQL_Delay: 60
3.延时从库停止方法
#停止主从
mysql> stop slave;
#设置延时为0
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
#开启主从
mysql> start slave;
关闭半同步:
主库执行
SET GLOBAL rpl_semi_sync_master_enabled = 0;
SET GLOBAL rpl_semi_sync_master_wait_no_slave = 0;

从库执行:
SET GLOBAL rpl_semi_sync_slave_enabled = 0;




写技术文不易,将近 6000 字。觉得有帮助的就赞助支持下好了,没条件的也随意,就看文章学习就好。谢谢你。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值