標籤:linux mysql centos 主從
為了做實驗方便,我們在同一台機器上配置兩個MySQL服務(開兩個連接埠)
1、安裝、配置MySQL
事先已經安裝好mysql;
[[email protected] ~]# cd /usr/local/[[email protected] local]# cp -r mysql/ mysql_2[[email protected] local]# cd mysql_2/
初始化mysql2,如果出現兩個 “OK” 並且產生/data/mysql2目錄說明正確;
[[email protected] mysql_2]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2
拷貝設定檔
[[email protected] mysql_2]# cp /etc/my.cnf ./my.cnf
修改設定檔相關參數,更改port 以及 socket ,並增加datadir=/data/mysql2
[[email protected] mysql_2]# vi my.cnf [mysqld]port = 3307socket = /tmp/mysql2.sockdatadir=/data/mysql2
啟動:
[[email protected] mysql_2]# /usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &
如果想開機啟動,需加入到/etc/rc.local 裡;
# echo "/usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &" >> /etc/rc.d/rc.local
netstat查看已經有2個mysqld服務:
[[email protected] mysql2]# netstat -nlp |grep mysqldtcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1203/mysqld tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 1744/mysqld unix 2 [ ACC ] STREAM LISTENING 8804 1203/mysqld /tmp/mysql.sockunix 2 [ ACC ] STREAM LISTENING 14159 1744/mysqld /tmp/mysql2.sock
2、 配置主從準備工作
設定mysql_2 為主(master)連接埠3307,mysql為從(slave)連接埠為3306
使用sock檔案登入主mysql
[[email protected] mysql2]# /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock
-S 後面指定mysql的socket檔案路徑,這也是登陸mysql的一種方法,因為在一台伺服器上跑了兩個mysql連接埠,所以,只能用 -S 這樣的方法來區分。
在主上建立測試庫db1
mysql> create database db1;mysql> quit
匯出主的mysql庫資料然後匯入給db1
[[email protected] mysql2]# /usr/local/mysql_2/bin/mysqldump -uroot -S /tmp/mysql2.sock mysql > 123.sql[[email protected] mysql2]# /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock db1 < 123.sql
3、配置主(master)
vim /usr/local/mysql_2/my.cnf
在[mysqld]部分查看是否有以下內容,如果沒有則添加:
server-id=1
log-bin=mysql-bin
兩個選擇性參數(2選1):
binlog-do-db=db1,db2 #需要同步的庫
binlog-ignore-db=db1,db2 #忽略不同步的庫
binlog-do-db=需要複製的資料庫名,多個資料庫名,使用逗號分隔。binlog-ignore-db=不需要複製的資料庫庫名,多個資料庫名,使用逗號分隔。
修改設定檔後,重啟mysql_2
[[email protected] mysql2]# pid=`ps aux |grep mysql2.sock |grep -v grep |awk ‘{print $2}‘`[[email protected] mysql2]# kill $pid[[email protected] mysql_2]# /usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &
設定root密碼:
[[email protected] mysql2]# /usr/local/mysql_2/bin/mysqladmin -uroot -S /tmp/mysql2.sock password ‘123456‘[[email protected] mysql2]# /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock -p123456
mysql> grant replication slave on *.* to ‘repl‘@‘127.0.0.1‘ identified by ‘123123‘;
//這裡的repl是為slave端設定的訪問master端mysql資料的使用者,密碼為123123,這裡的127.0.0.1為slave的ip(本次實驗配置的master和slave都在本機)。
mysql> flush privileges; //重新整理庫,記憶體的資料寫入磁碟;
mysql> flush tables with read lock;
//鎖定資料庫,此時不允許更改任何資料
mysql> show master status;+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000004 | 378 | | |+------------------+----------+--------------+------------------+
//查看狀態,這些資料是要記錄的,一會要在slave端用到;
4、 設定從(slave)
vim /etc/my.cnf #修改或增加
server-id = 2 #這個數值不能和主一樣
選擇性參數:replicate-do-db=db1,db2
replicate-ignore-db=db1,db2 #意義同主的那兩個選擇性參數
重啟從的mysql服務:service mysqld restart
拷貝主的db1庫資料到從:
先匯出db1.sql檔案,然後在從資料庫中同樣建立資料庫db1,匯入主的db1.sql檔案到從;
[[email protected] ~]# /usr/local/mysql_2/bin/mysqldump -uroot -S /tmp/mysql2.sock -p123456 db1 > db1.sql[[email protected] ~]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -e "create database db1"[[email protected] ~]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock db1 < db1.sql
登陸從的mysql
[[email protected] ~]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock mysql> slave stop;mysql> change master to master_host=‘127.0.0.1‘,master_port=3307,master_user=‘repl‘,master_password=‘123123‘,master_log_file=‘mysql-bin.000004‘,master_log_pos=378;
//master_log_file=‘mysql-bin.000004‘,master_log_pos=378為主show master status顯示的前2列內容;
mysql> slave start;
主上,解鎖表:
[[email protected] ~]# /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock -p123456 -e "unlock tables"
登入從
[[email protected] ~]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock
查看從的狀態 show slave status\G;
確認以下兩項參數都為yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 127.0.0.1 Master_User: repl Master_Port: 3307 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 378 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 378 Relay_Log_Space: 410 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
5、 測試主從
主上清空db1庫的db表 :
登入主
[[email protected] ~]# mysql -uroot -S /tmp/mysql2.sock -p123456mysql> use db1;mysql> select count(*) from db;+----------+| count(*) |+----------+| 2 |+----------+
清空db表;
mysql> truncate table db;mysql> select count(*) from db; +----------+| count(*) |+----------+| 0 |+----------+
進入slave,查看db1庫db表,和主的資料一樣,表示同步OK;
[[email protected] ~]# mysql -uroot -S /tmp/mysql.sock mysql> use db1;mysql> select count(*) from db;+----------+| count(*) |+----------+| 0 |+----------+
登入主,刪除表db;
[[email protected] ~]# mysql -uroot -S /tmp/mysql2.sock -p123456mysql> drop table db;
登入從,查看db表不存在;
[[email protected] ~]# mysql -uroot -S /tmp/mysql.sock mysql> select * from db;ERROR 1146 (42S02): Table ‘db1.db‘ doesn‘t exist
建議: MySQL主從機制比較脆弱,謹慎操作。如果重啟master,務必要先把slave停掉,也就是說需要在slave上去執行 slave stop 命令,然後再去重啟master的mysql服務,否則很有可能就會中斷了。當然重啟完後,還需要把slave給開啟 slave start。
本文出自 “模範生的學習部落格” 部落格,請務必保留此出處http://8802265.blog.51cto.com/8792265/1655877
linux下配置mysql主從