標籤:
一、先配置好兩個MySQL執行個體並可以正常啟動
1. 首先在Linux上先安裝好MySQL資料庫,此處省略詳細的安裝步驟(可以使用yum安裝)
yum -y install mysqld mysql
2. 在/usr/local目錄下建立目錄mysqls/mysql1, mysqls/mysql2 分別作為我們的主要資料和從資料庫目錄,建立mysqls/run作為MySQL PID存放目錄,建立mysqls/log作為MySQL日誌目錄
mkdir -p /usr/local/mysqls/mysql1 /usr/local/mysqls/mysql2
mkdir -p /usr/local/mysqls/run /usr/local/mysqls/log
3. 複製MySQL預設的設定檔/etc/my.cnf到/usr/local/mysqls下,並複製兩份分別命名為mysql1.cnf和mysql2.cnf。這兩個檔案將作為主從MySQL資料庫的設定檔(使用這種方式,可以不影響原有MySQL配置,預設MySQL仍可正常使用)
cp /etc/my.cnf /usr/local/mysqls/mysql1.cnf
chown -R mysql:mysql
cd /usr/local/mysqls
cp mysql1.cnf mysql2.cnf
4. 修改MySQL執行個體設定檔,指定datadir, socket, port, log-error, pid-file的路徑:
mysql1.cnf 配置如下:
[mysqld]
datadir=/usr/local/mysqls/mysql1
socket=/usr/local/mysqls/mysql1/mysql.sock
port=33061
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#default-character-set=utf8
character-set-server=utf8
[mysqld_safe]
log-error=/usr/local/mysqls/log/mysql1.log
pid-file=/usr/local/mysqls/run/mysql1.pid
[client]
default-character-set=utf8
socket=/usr/local/mysqls/mysql1/mysql.sock
mysql2.cnf 參考上面配置,使用mysql2目錄,連接埠號碼設定為33062
5. 接下來使用mysql_install_db指令碼初始化這兩個MySQL資料庫執行個體(該指令碼會在mysql1和mysql2目錄下自動安裝MySQL基本資料庫 : mysql)
/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql1.cnf
/usr/bin/mysql_install_db --defaults-file=/usr/local/mysqls/mysql2.cnf
6. 為了每次方便啟動執行個體,我們可以編寫如下啟動指令碼,指令碼中使用mysqld_safe啟動MySQL執行個體:
start_mysql1.sh 內容如下:
#/bin/bash
no=1
exe=/usr/bin/mysqld_safe
madmin=/usr/bin/mysqladmin
base=/usr/local/mysqls
sub=mysql$no
conf=$base/$sub.cnf
socket=$base/$sub/mysql.sock
pidfile=$base/run/$sub.pid
port=3306$no
timeout=60
$exe --defaults-file=$conf 2>&1 &
while [ $timeout -gt 0 ]; do
$madmin --socket="$socket" --user=root --port=$port ping >/dev/nul 2>&1
mret=$?
if [ $mret -eq 0 ]; then
now=`date +‘%Y-%m-%d %H:%M:%S‘`
echo "[$now] Start $sub : OK"
echo "[$now] PID : `cat $pidfile`"
netstat -atulnp | grep $port
break
fi
sleep 1
let timeout=${timeout}-1
done
start_mysql1.sh 用於啟動mysql1,同樣我們可以類似編寫start_mysql2.sh用於啟動mysql2(修改no變數的值為2即可)
註:shell 指令檔在執行前需要設定可執行許可權(類似這樣:chown u+x start_mysql1.sh)
7. 至此,MySQL兩個執行個體的準備工作就做好了,我們可以嘗試啟動它們了(以mysql1為例)
/usr/local/mysqls/start_mysql1.sh
如果一切順利,將出現以下結果:
二、 接下來,我們開始設定主從複製
1. 停止MySQL執行個體,為了方便同樣編寫停止指令碼
stop_mysql.sh內容如下:
#/bin/bash
if [ $# -ne 1 ]; then
echo "Usage : $0 <mysql no>"
exit -1
fi
no=$1
sub=mysql$no
base=/usr/local/mysqls
pidfile=$base/run/$sub.pid
if [ ! -f "$pidfile" ]; then
echo "‘$pidfile‘ not exist, mysql server may not start"
exit -2
fi
pid=`cat $pidfile`
kill $pid
執行:stop_mysql.sh 1 即可停止mysql1, 後面參數改為2即可停止mysql2,就像下面這樣:
2. 配置主要資料庫,開啟複製功能(這裡使用mysql1作為主要資料庫,mysql2作為從資料庫)
mysql1.cnf中[mysqld]標記下面增加如下配置:
[mysqld]
...
#replication
log-bin=/usr/local/mysqls/log/mysql1-bin.log # 這是MySQL bin log的位置
server-id=1 # server id, 標識mysql
# 下面兩個參數表示確保InnoDB交易資料庫可以保持最大的持久性和一致性
innodb_flush_log_at_trx_commit=1
sync_binlog=1
# 額外的參數,我們可以設定置複製哪個庫、哪個表,不複製哪個庫、哪個表(這裡不詳述,具體參考MySQL官方文檔)
# 例如:
# replicate-do-db=mydb
# replicate-do-table=mytable
# replicate-ignore-db=mysql
# replicate-ignore-table=user
3. 啟動mysql1,mysql命令串連並添加複製賬戶,同時查看master狀態
start_mysql1.sh
mysql -S /usr/local/msyqls/mysql1.sock -uroot -p
mysql> grant all on *.* to ‘rep‘@‘localhost‘ identified by ‘replpass‘; # 實際環境中這雷根據自己需求而定
mysql> flush privileges;
mysql> show master status \G
*************************** 1. row ***************************
File: mysql1-bin.000002
Position: 1486
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
4. 如果主從資料庫是全新搭建的(沒有實際資料)可以不用備份主庫到從庫,否則需要匯出主庫資料到從庫
# 設定讀鎖(禁止寫入)
mysql> flush tables with read lock;
# 執行備份操作
/usr/bin/mysqldump -uroot -p --database mydb1, mydb2 ... > dump.sql
#解鎖
mysql> unlock tables;
?
5. 配置從資料庫複寫參數
mysql2.cnf中mysqld標記下增加如下配置:
#replication
log-bin=/usr/local/mysqls/log/mysql2-bin.log
server-id=2
master-host=localhost # 主庫地址
master-port=33061 # 主庫連接埠號碼
master-user=rep # 上面所設定的複製賬戶
master-pass=somepass # 複製賬戶密碼
master-connect-retry=60 # 重試串連的間隔時間
6. 啟動從資料庫,若主庫有資料需要匯入則先匯入剛才的備份,接著設定複製起始位置,啟動slave
start_mysql2.sh
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p < dump.sql
mysql -S /usr/local/mysqls/mysql2/mysql.sock -uroot -p
mysql> change master to
-> master_log_file=mysql1-bin.000002
-> master_log_pos=1486;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: rep
Master_Port: 33061
Connect_Retry: 60
Master_Log_File: mysql1-bin.000002
Read_Master_Log_Pos: 1486
Relay_Log_File: mysql2-relay-bin.000002
Relay_Log_Pos: 252
Relay_Master_Log_File: mysql1-bin.000002
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: 106
Relay_Log_Space: 554
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: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
7. OK , MySQL兩執行個體主從複製就搭建好了。
註:文中使用mysql命令時指定socket檔案是必須的,亦可以類似寫相應的指令碼以免每次串連都需加這個參數
mysql1.sh 內容如下:
#/bin/bash
no=1
base=/usr/local/mysqls/
sub=mysql$no
socket=$base/$sub/mysql.sock
mysql -S $socket $*
mysql2.sh 則修改no的值為2
單伺服器MySQL主從複製實踐