目錄
5. 登陸從服務器的mysqlServer指定master數據庫ip、slave用戶密碼、binlog文件號和位置號
1.配置主服務器
vim /etc/my.cnf (存放配置文件的地方每個人的不一樣,可根據mysql --help | grep my.cnf 或者 find / -name my.cnf 查看)
配置三個參數:
server-id=1 # 本數據庫的服務id
log-bin=master-bin #啓用二進制日誌;key值的名字固定,value表示你定義 的二進制文件的名字.可以自定義
log-bin-index=master-bin.index # 指定的是binlog文件的索引文件,這個文件管理了所有的binlog文件的目錄
保存退出::wq
重新啓動mysql(啓動方法因你的服務器各異)
先service mysqld stop; 然後 service mysqld start
或者直接service mysqld restart
選配:
// 也可以配置需要同步的數據庫和忽略的數據庫(選填)
#不同步的數據庫,可設置多個
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
#指定需要同步的數據庫(和slave是相互匹配的),可以設置多個
binlog-do-db=test
注:不配置則默認所有數據庫
2.配置從服務器
同樣修改從服務器上數據庫配置,添加server-id,不要和主服務器重複
server-id=2 # 本數據庫的服務id
按照步驟一重啓。
3.鎖表備份主服務器數據並導入從服務器數據庫
命令行登錄主數據庫 mysql -uroot -p
創建複製權限的用戶
grant replication slave on *.* to slave@"%" identified by "slave”;
flush privileges;
數據庫鎖表,不讓寫數據; 生產環境中必須鎖,測試環境無需鎖
flush tables with read lock;
輸入:show master status; #查看master的狀,file是二進制文件,position記錄當前操作sql的步驟數
記住這兩個參數,保存起來,配置從節點服務時候需要使用。
show master status;
(注意不是sql的數量,因爲一條sql包含了多個步驟,所以不是sql語句的條數)
導出已有數據:
mysqldump -uroot -p --all-databases > data20191029.sql
導出成功以後:在當前目錄下可以看到這個data20191029.sql文件
將壓縮文件上傳至從服務器:
scp data20191029.sql [email protected]:/var/lib/mysql/
登錄從服務器導入到當前數據庫目錄
登錄mysqlServer,然後執行
source /var/lib/mysql/data20191029.sql;
4.備份完成後解鎖表
輸入unlock tables; 解鎖表寫操作,主數據庫到此配置完畢
unlock tables;
5. 登陸從服務器的mysqlServer指定master數據庫ip、slave用戶密碼、binlog文件號和位置號
change master to
master_host='192.168.11.20',
master_port=3306,
master_user='slave',
master_password='slave',
master_log_file='master-bin.000001',
master_log_pos=55390;
開啓從節點服務狀態;stop slave;停止服務,出錯時先停止,再重新配置
start slave;
輸入:show slave status \G; 查看從數據庫狀態(如果Slave_IO_Runing 和 Slave_SQL_Runing都是yes,則表示配置成功)
show slave status \G;
6.錯誤處理1:
因爲我的從數據庫是直接從主數據複製過來的鏡像,所以show slave status \G;的時候Slave_IO_Runing參數爲NO,報錯代碼是Fatal error: The slave I/O thread stops because master and slave have equal
查看服務器uid名稱:
vim /var/lib/mysql/auto.cnf
結果如下:和主服務器上查看的一樣
解決方法:
先停止從節點服務:
stop slave;
停止從庫的mysqld服務,刪除他的auto.cnf文件,再啓動數據庫服務即可。
service mysqld stop
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
service mysqld start
然後再開啓從節點服務,即可解決。
start slave;
show slave status \G;
記錄一次大坑:
這後面一定不要有空格,不然會報語法錯誤。查了我半天 才找出來原因
7.錯誤處理2:
錯誤爲:
Got fatal error 1236 from master when reading data from binary log: 'A slave with the same server_uuid/server_id as this slave has connected to the master; the first event 'master-bin.000003' at 734457224, t
he last event read from './master-bin.000003' at 745608042, the last byte read from './master-bin.000003' at 745608042.'
解決方法:
1.輸入一下指令查看server_id值。
show variables like '%server%id%';
在幾臺從服務器上查看一下server_id是否重複,由於我開始只有一臺從服務器,由於運維在不知情的情況下,用從服務做了鏡像克隆了從庫,分配了幾臺新的服務器,結果把從數據庫的配置都拷貝到了新服務器上。所以在那幾臺新服務器上輸入該指令,就可以看到相同的信息。
2. 如果此臺服務器也用作從庫,則修改/etc/my.cnf中server_id的配置。
vim /etc/my.cnf
3.如果只是server_uuid相同,刪除auto.cnf文件(auto.cnf文件在/etc/my.cnf中datadir配置的目錄下),然後重啓數據庫,數據庫會重新生成server_uuid和auto.cnf文件(默認在/var/lib/mysql目錄下)
如果不需要新增的,直接停止數據庫即可。如果需要新增的,則需要跟換server_id並刪除auto.cnf,再重啓mysql和slave數據庫節點。
service mysqld stop
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
service mysqld start
4.我這裏只保留一臺從數據庫,所以我停掉了其他數據庫。然後再去報錯的從數據庫裏登錄:mysql -uroot -p,然後重啓節點。
stop slave;
start slave;
總結:
1.不進入mysql控制檯執行命令:
--查看節點信息:
mysql -uroot -ppassword "show slave status \G";
--監聽從服務器節點的腳本
#!/bin/bash
HOSTNAME="localhost"
PORT="3306"
USERNAME="root"
PASSWORD="root@sql"
#數據庫名稱,所有數據庫可填空
DBNAME=""
use_db_sql="use ${DBNAME}"
CORRECT=Yes
select_sql="show slave status\G;"
state=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" 2>/dev/null`
#提取系統變量
slave_sql_running=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" 2>/dev/null | awk -n -F": " '{if ($1 ~/Slave_SQL_Running$/) print $2}'`
slave_io_running=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" 2>/dev/null | awk -n -F": " '{if ($1 ~/Slave_IO_Running$/) print $2}'`
#這裏打出需要判斷的系統變量
echo $slave_sql_running
echo $slave_io_running
# 發送郵件通知
# echo "從數據庫發生錯誤,錯誤信息爲:$state" | mail -s "從數據庫錯誤通知" [email protected]
if [ $slave_sql_running != $CORRECT -o $slave_io_running != $CORRECT ]; then
echo "從數據庫發生錯誤,錯誤信息爲:$state" | mail -s "從數據庫錯誤通知" [email protected]
fi