mysql 主从复制 mysql


https://hub.docker.com/_/mysql

docker run -d  -p 3306:3306  --name mariadb --restart=always -e TZ='Asia/Shanghai'   --ulimit nofile=262144:262144  -v /etc/localtime:/etc/localtime:ro  -e MYSQL_ROOT_PASSWORD='wdqdmm@r'  -e MYSQL_ALLOW_EMPTY_PASSWORD='no'  -v  /data/file:/data/file/  -v  /data/site/docker/data/mysql8:/var/lib/mysql  mysql:8.0-debian   --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  --default-authentication-plugin=mysql_native_password  --log_bin='ON'  --binlog_format='row' --binlog_row_image=full  --gtid_mode='ON' --enforce_gtid_consistency='ON'  --log_slave_updates='ON'  --skip_slave_start='OFF'  --log_bin_use_v1_row_events='OFF' --max_allowed_packet='800M'  --default_storage_engine='InnoDB' --character-set-client-handshake='FALSE'  --character-set-server='utf8mb4' --init_connect='SET NAMES utf8mb4' --max_connections='10000'  --wait_timeout='600'  --interactive_timeout='600'  --bind-address='0.0.0.0'  --slow_query_log='ON'  --slow_launch_time='10' --general_log='ON'  --server_id='11' 

---异常

--lower_case_table_names='1'


docker run -d   -p 3316:3306  --name mariadbtest --restart=always  -e MYSQL_ROOT_PASSWORD='wdqdmm@r'  -e MYSQL_ALLOW_EMPTY_PASSWORD='no'  -v  /data/file:/data/file/  mysql:8.0-debian   --default-authentication-plugin=mysql_native_password  --log_bin='ON'  --binlog_format='row' --binlog_row_image=full  --gtid_mode='ON' --enforce_gtid_consistency='ON'  --log_slave_updates='ON'  --skip_slave_start='OFF'  --log_bin_use_v1_row_events='OFF' --max_allowed_packet='800M'  --default_storage_engine='InnoDB' --character-set-client-handshake='FALSE'  --character-set-server='utf8mb4' --init_connect='SET NAMES utf8mb4' --max_connections='10000'  --wait_timeout='600'  --interactive_timeout='600'  --bind-address='0.0.0.0'  --slow_query_log='ON'  --slow_launch_time='10' --general_log='ON'  --server_id='11'


docker exec -it mariadb /bin/bash


# 将主服务器需要同步的数据库内容进行备份一份,上传到从服务器上,保证始初时两服务器中数据库内容一致。


# 清空两台主机的master和slave日志

reset master;

reset slave;


#主服务器Master配置


---my.cnf

[mysqld]
skip-host-cache
skip-name-resolve
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#secure-file-priv=
secure-file-priv= NULL
bind-address = '0.0.0.0'
#skip-grant-tables
max_connections = '10000'
max_allowed_packet = '500M'
wait_timeout= '600'
interactive_timeout = '600'
server-id = '11'
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = '1'
log_error = '/var/log/mysql/error.log'
slow_query_log = 'ON'
slow_query_log_file = '/var/log/mysql/mysql-slow.log'
slow_launch_time        = '10'
general_log = 'ON'
general_log_file = '/var/log/mysql/mysql.log'
#
default_storage_engine = 'InnoDB'
character-set-client-handshake='FALSE'
character-set-server='utf8mb4'
collation-server='utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
log_bin = 'ON'
binlog_format = 'row'
binlog_row_image = full
gtid_mode = 'ON'
enforce_gtid_consistency = 'ON'
log-slave-updates = 'ON'
skip-slave-start = 'OFF'
log_bin_use_v1_row_events = 'OFF'
default_authentication_plugin = 'mysql_native_password'
# Custom config should go here
!includedir /etc/mysql/conf.d/

MySQL主从 (gtid模式)

---master
gtid-mode = on //开启gtid模式
enforce-gtid-consistency = on //强制gtid一致性,开启后对特定的create table不被支持
binlog-format = row  //默认为mixd混合模式,更改成row复制
log-slave-updates = 1  //日志更新打开
skip-slave-start = 1   #跳过slave复制线程(必须从主库开始复制)
show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000014 |     1951 |              |                  | b736875b-097e-11ec-b557
————————————————
---从
skip-slave-start = 1
log-slave-updates = 1
gtid-mode = on 
enforce-gtid-consistency = on
---
 change master to
    -> master_host='192.168.75.160' ,
    -> master_user='yang' ,
    -> master_password='1234' ,
    -> master_auto_position=1;

---双主多从
//主库1
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000014 |     2128 
————————————————
主库2
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000002 |      154 |
————————————————
---在从库上配置主库信息
set global master_info_repository='table';
set global relay_log_info_repository='table';
//主库1
change master to
    -> master_host='192.168.75.160' ,
    -> master_user='yang' ,
    -> master_password='1' ,
    -> master_log_file='mysql-bin.000014'
    -> master_log_pos=2128
    -> for channel 'master-1';  
//主库2
mysql> change master to
    -> master_host='192.168.75.150' ,
    -> master_user='ang' ,
    -> master_password='1' ,
    -> master_log_file='mysql-bin.000002'
    -> master_log_pos=154
    -> for channel 'master-2';  //创建隧道
mysql> START SLAVE;
//查看
mysql> SHOW SLAVE STATUS\G

---GTID如何跳过事务冲突
1、这个功能主要跳过事务,代替原来的set global sql_slave_skip_counter = 1。
2、由于在这个GTID必须是连续的,正常情况同一个服务器产生的GTID是不会存在空缺的。所以不能简单的skip掉一个事务,只能通过注入空事物的方法替换掉一个实际操作事务。
3、注入空事物的方法:
stop slave;
set gtid_next='xxxxxxx:N';
begin;commit;
set gtid_next='AUTOMAIC';
start slave;
4、这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。


---创建同步用户

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'wdqdmm@m';

flush privileges;


---查看状态

SHOW MASTER STATUS; 


---锁住表,防止写操作, 

flush tables with read lock;


---!完成同步, 最好解锁

unlock tables;


# 从服务器Slave配置

---my.cnf

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
max_connections = 500
skip_name_resolve = 1
# 开启事件执行器
event_scheduler=1
server-id = 22
slow_query_log = 1
slow_query_log_file = /data/file/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 0
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log-bin = /data/file/mysql/binlog
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 14
binlog_format = mixed
binlog_checksum = 1
relay_log_recovery = 1
relay-log-purge = 1
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
max_allowed_packet = 512M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M


---用change mster 语句指定同步位置

stop slave;          //先停步slave服务线程,这个是很重要的,如果不这样做会造成以下操作不成功。

change master to  master_host='59.151.15.36', MASTER_PORT=3306, master_user='slave', master_password='123456', master_log_file='mysql-bin.000016',  master_log_pos=107;


注:master_log_file, master_log_pos由主服务器(Master)查出的状态值中确定。也就是刚刚叫注意的。master_log_file对应File, master_log_pos对应Position。Mysql 5.x以上版本已经不支持在配置文件中指定主服务器相关选项。

-遇到的问题,如果按上面步骤之后还出现如下情况, 则要重新设置slave。指令如下

stop slave;

reset slave;

-之后停止slave线程重新开始。成功后,则可以开启slave线程了。

start slave;


---查看从服务器(Slave)状态

show slave status\G

-查看下面两项值均为Yes,即表示设置从服务器成功。

Slave_IO_Running: Yes

Slave_SQL_Running: Yes


=============================================

#如何解决MySQL主从同步错误的SQL

stop slave; 

set global sql_slave_skip_counter =1;  #表示跳过一步错误,后面的数字可变

start slave; 

-查看

show slave status\G


Slave_IO_Running: Yes

Slave_SQL_Running: Yes 


# Seconds_Behind_Master:   和主库比同步延迟的秒数

show slave status\G;

从库状态 Seconds_Behind_Master 变小到很小就可以


# Slave_SQL_Running: No mysql同步故障

发现一台MySQL Slave未和主机同步,查看Slave状态: 

mysql> show slave status\G 

Slave_IO_Running: Yes 

Slave_SQL_Running: No 


stop  slave 

-跳过错误步数,后面步数可变

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 

start  slave 


# MySQL的错误:No query specified

show slave status\G;的时候,多加了一个“;”分号。


# max_binlog_cache_size设置不当

show global status like '%binlog_cache%';

set  global max_binlog_cache_size=40*1024*1024*1024;


# 主从时出现如下错误:The slave I/O thread stops because master and slave have equal MySQL server ids

-两边的server_id 是否一样,一样则修改my.cnf设置

show variables like '%server_id%';

SET GLOBAL server_id=2;

-如果一样则删除从数据库的数据目录下的auto.cnf:

show variables like '%uuid%';

-确认主从数据库的数据host是否一样,如果主从数据库的host一样也会报这个错误.

rm -rf  /var/lib/mysql/auto.cnf

-他们有不同的作用。当主从同步时如果主从实例的server-uuid相同会报错退出,

-不过我们可以通过设置replicate-same-server-id=1来避免报错(不推荐)

replicate-same-server-id=1


# 去除主从

reset slave all;


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回