生產環境下,centos服務器,mysql數據庫配置主從複製

目錄

1.配置主服務器

2.配置從服務器

3.鎖表備份主服務器數據並導入從服務器數據庫

4.備份完成後解鎖表

5. 登陸從服務器的mysqlServer指定master數據庫ip、slave用戶密碼、binlog文件號和位置號

6.錯誤處理1:

7.錯誤處理2: 


 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章