主從復制原理:復制是 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;
建議大家有資源的話盡量在兩台機器上實驗,一台機器上容易有坑。