Mysql主從複製
1 mysql主從複製原理
mysql複製是mysql自身內建的功能。複製的過程中一臺服務器充當主服務器,而一個或多個其他服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並通過維護文件的一個索引來跟蹤日誌循環。主服務器中mysql主要提供認證服務,同時會啓動一個sqldump線程,這個線程會接受從服務器用戶的請求,並確保這個用戶具有權限之後,會去讀取二進制日誌中的事件,如從服務器是第一次來請求,那麼這個進程就讀取日誌中的第一個事件,讀一個就發送給從服務器一個,從服務器的進程在接收到主服務器發行過來的數據之後,會保存在本地的中繼日誌,然後再啓動一個具有特殊功能的線程,去中繼日誌中讀取事件,讀一行,在本地執行一下,以此類推,最終生成本地的數據庫。
注意:複製時,所有對複製中的表的更新必須在主服務器中進行。從服務器只能被動的接受數據,本身並不會接受客戶端鏈接進來做任何寫操作,從服務器中的數據都是來自主服務器。
2 主從複製實現步驟
2.1 實驗環境
[root@mysql ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
2.2 必備軟件安裝
[root@mysql tools]# ls
cmake-2.8.7.tar.gz mysql-5.5.32.tar.gz
在安裝cmake和mysql之前需要安裝一些其他必備的包
[root@mysql ~]# yum install make gcc vim ncurses-devel libaio-devel qt* –y
2.2.1 源碼安裝cmake
[root@mysqltools]# tar zxvf cmake-2.8.7.tar.gz
[root@mysqltools]# cd cmake-2.8.7
[[email protected]]# ./configure
[[email protected]]# gmake && gmake install
2.2.2 源碼安裝mysql
解壓
[root@mysql tools]# tar zxvfmysql-5.5.32.tar.gz
創建mysql用戶和組
[root@mysql tools]# groupadd mysql
[root@mysql tools]# useradd –gmysql –s /sbin/nologin –M mysql
[root@mysql tools]# cd mysql-5.5.32
創建安裝目錄
[[email protected]]# mkdir /application –p
開始檢查編譯環境編譯
[[email protected]]# cmake-DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 -DMYSQL_DATADIR=/application/mysql-5.5.32/data-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock -DEXTRA_CHARSETS=gbk.gb2312.utf8.ascii -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0
編譯安裝
[root@mysql mysql-5.5.32]# make&& make install
[[email protected]]# cp /server/tools/mysql-5.5.32/support-files/my-small.cnf/etc/my.cnf
[[email protected]]# ln -s /application/mysql-5.5.32/ /application/mysql
配置環境變量
[[email protected]]# echo 'PATH=/application/mysql/bin:$PATH' >>/etc/profile
[[email protected]]# source /etc/profile
授權data目錄
[[email protected]]# chown -R mysql.mysql /application/mysql/data/
創建多實例配置目錄
[[email protected]]# mkdir -p /data/{3306,3307}/data
[[email protected]]# cp /server/tools/mysql-5.5.32/support-files/my-small.cnf /data/3306/my.cnf
[root@mysql3306]# cp my.cnf /data/3307/
[root@mysql3307]# sed -i 's#3306#3307#g' my.cnf
[root@mysql3307]# vim my.cnf
將server-id改成3
[root@mysql3307]# chown -R mysql.mysql /data/
[root@mysql3306]# cd /application/mysql/scripts/
初始化數據庫
[root@mysql scripts]# ./mysql_install_db--basedir=/application/mysql --datadir=/data/3306/data --user=mysql
[root@mysql scripts]#./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data--user=mysql
啓動mysql多實例
[root@mysqlscripts]# mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 >/dev/null &
[root@mysql scripts]# mysqld_safe--defaults-file=/data/3307/my.cnf 2>&1 > /dev/null &
查看多實例是否生效
[root@mysqlscripts]# ss -ntulp|grep 330
多實例進入mysql
[root@mysql~]# mysqladmin password oldboy123 -S /data/3306/mysql.sock
[root@mysql ~]# mysqladmin passwordoldboy456 -S /data/3307/mysql.sock
[root@mysql~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
2.3 複製過程
2.3.1 主服務器開啓bin log
[root@mysql mysql]# vim/data/3306/my.cnf
要有這一行:log-bin = /data/3306/mysql.bin
2.3.2主服務器設置server-id
[root@mysql mysql]# vim/data/3306/my.cnf
server-id = 1
2.3.3 從服務器設置server-id(與主服務器不一樣)
[root@mysql mysql]# vim/data/3307/my.cnf
server-id = 3
從庫不需要開啓bin log
2.3.4 主服務器創建授權用戶
[root@mysql ~]# mysql -uroot-poldboy123 -S /data/3306/mysql.sock
mysql> grant replication slaveon *.* to mike@'192.168.200.140' identified by 'abc123abc';
mysql> flush privileges;
2.3.5 主服務器開始鎖表進行數據備份
mysql> flush table with readlock;
[root@mysql ~]# mysqldump -uroot-poldboy123 --events -S /data/3306/mysql.sock -A -B|gzip>/tmp/slave_backup.sql
[root@mysql ~]# ls -l /tmp/
mysql> show master status;
2.3.6 從服務器將主服務器的數據庫導入本地
[root@mysql ~]# mysql -uroot-poldboy123 -S /data/3307/mysql.sock </tmp/slave_backup.sql
2.3.7 主庫解除鎖表
mysql>unlock tables;
2.3.8 從服務器配置change master連接主庫
mysql> change master to master_host='192.168.200.140',master_user='mike',master_password='abc123ABC',master_log_file='mysql.000002',master_log_pos=651;
2.3.9 從服務器開始與主庫同步
mysql>start slave;
3 實驗測試
主庫:
從庫:
同步測試:
主庫:
從庫: