MySQL 5.7主從搭建(同一台機器)


主從復制原理:復制是 MySQL 的一項功能,允許服務器將更改從一個實例復制到另一個實例。
1)主服務器將所有數據和結構更改記錄到二進制日志中。
2)從屬服務器從主服務器請求該二進制日志並在本地應用其內容。
3)IO:請求主庫,獲取上一次執行過的新的事件,並存放到relaylog
4)SQL:從relaylog中將sql語句翻譯給從庫執行
本次搭建在同一台機器上搭建,用不同用戶和不同端口以及不同程序路徑。安裝過程比較簡單,采用二進制的方式來做的。

主庫搭建:

加入環境變量:

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

當時啟動主庫的時候會有個錯誤:

查看error.log后:

原因是配置參數的問題,自動擴展配置參數設置的太大導致。

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

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

update mysql.user set authentication_string=password('L*Rb0!gtigergao!@#') where user='root' and Host = 'localhost'


初始化主庫后啟動mysql服務進行登錄,必須要先修改密碼:
ALTER USER "root"@"localhost" IDENTIFIED BY "shsnc!@#";
flush privileges;

登錄主庫創建主從同步用戶:
create user 'tigergao' identified by 'tigergao';

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

記錄binlog位置:

主庫配置完畢,需要進行配置從庫。
注意:由於我是在同一台機子上做的主從,主庫采用的做了軟鏈后用service mysql start的方式啟動的,由於擔心同時做軟鏈會發生沖突,所以從庫用命令的方式啟動的。

 

從庫配置:

 加入環境變量

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

從庫采用命令啟動指定配置文件:
/usr/local/mysql/bin/mysqld_safe --defaults-extra-file=/etc/my3306.cnf --datadir=/mysql3306 --user=mysql &
從庫初始化:
mysqld --initialize --user=mysql01 --datadir=/data/data --basedir=/data/mysql --socket=/data/data/mysqldbs.sock
從庫啟動:指定配置文件的方式啟動
/data/mysql/bin/mysqld_safe --defaults-extra-file=/data/mysql/conf/my.cnf --datadir=/data/data --basedir=/data/mysql --user=mysql01 &

ps -ef | grep -i mysql |grep -v grep 查看進程,3306和3309都已經起來了。

 

設置主從:

 

設置主從:需要在從庫上執行
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

 

 

 

在從庫上查看sql線程和io線程是否成功應用,如果已應用代表就是成功了。show slave status \G;

驗證主從,在主庫上創建數據庫:tigergao;在數據庫tigergao中創建一張學生表並插入數據。

然后在從庫上查看:

可以看到從庫已經把數據庫和表以及數據都同步過來了。分別去查看主庫和從庫的數據目錄下的數據。
主從已經搭建成功。
主從復制基本故障處理
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;

 

 

 建議大家有資源的話盡量在兩台機器上實驗,一台機器上容易有坑。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM