MySQL5.7主從複製配置,資料同步
阿新 • • 發佈:2019-02-06
MySQL5.7主主複製配置
主機1IP:172.16.1.206
主機2IP:172.16.1.226
一、首先安裝MySQL 5.7
1、解除安裝兩臺主機系統中已經有的mysql相關軟體包
rpm -qa | grep -i mysql
yum remove mysql(相關軟體包名稱) -y
2、分別在兩臺主機系統中執行以下命令
在http://dev.mysql.com/downloads/repo/yum/站點下載mysql57-community-release-el6-8.noarch
rpm -ivh mysql57-community-release-el6-8.noarch.rpm
yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64
3、分別在兩臺主機上執行以下語句,初始化
mkdir /home/mysql
mysqld --initialize-insecure --user=mysql --datadir=/home/mysql
備註:
如果你用 --initialize 初始化data目錄,請用如下命令登入服務
mysql -u root -p
執行上面命令,會提示輸入密碼,輸入隨機生成的密碼即可。
如果你不知道這個隨機密碼,請檢視error log檔案查詢這個隨機密碼。
如果用 --initialize-insecure 初始化data目錄,請用root用登入,並不需要輸入密碼就可以登入,如下命令:
mysql -u root --skip-password
Mysql5.7忘記root密碼及mysql5.7修改root密碼的方法的相關資料
a、關閉正在執行的 MySQL :service mysql stop
b、執行:mysqld_safe --skip-grant-tables &
c、為了安全可以這樣禁止遠端連線:mysqld_safe --skip-grant-tables --skip-networking &
d、使用mysql連線server:mysql -p
e、更改密碼:
mysql> update mysql.user set authentication_string=password('shopym') where user='root' and Host = 'localhost';
特別提醒注意的一點是,新版的mysql資料庫下的user表中已經沒有Password欄位了
而是將加密後的使用者密碼儲存於authentication_string欄位
4、分別登入修改主機1、主機2的mysql密碼
輸入mysql回車,進入mysql環境
set password = password ('shopym');
flush privileges;
5、在主機1(192.168.1.2)的/etc/my.cnf中配置以下內容
[mysqld]
datadir=/home/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1
explicit_defaults_for_timestamp = 1
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
replicate-do-db = wang #需要同步的資料庫
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
6、在主機1(192.168.1.4)的/etc/my.cnf中配置以下內容
[mysqld]
datadir=/home/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id = 2
auto-increment-increment = 2
auto-increment-offset = 2
character_set_server=utf8
interactive_timeout = 57600
log-bin = mysql-bin
expire-logs-days = 100
replicate-do-db = wang #需要同步的資料庫
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
slave-skip-errors=all
log-slave-updates
symbolic-links=0
skip-name-resolve
備註:主機1和主機2都只有server-id不同和 auto-increment- offset不同
auto-increment-offset是用來設定資料庫中自動增長的起點的,回為這兩能
伺服器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避
免兩臺伺服器資料同步時出現主鍵衝突replicate-do-db 指定同步的資料庫,
我們只在兩臺伺服器間同步shoym資料庫
另:auto-increment-increment的值應設為整個結構中伺服器的總數,本案例用到兩臺伺服器,所以值設為2
7、分別重啟主機1,主機2的mysql服務,使配置生效
service mysqld restart
8、在主機1(192.168.1.2)上建立資料庫和表並插入資料
mysql -uroot -pwclwcw
create database wang;
use wang;
create table wclwcw(id int,name varchar(100));
insert into wclwcw value (1,'tom')
9、相互授權
在主機1(172.16.1.206)上
GRANT REPLICATION SLAVE ON *.* TO 'shopym'@'172.16.1.226' IDENTIFIED BY 'shopym';
flush privileges;
在主機2(172.16.1.226)上
GRANT REPLICATION SLAVE ON *.* TO 'shopym'@'172.16.1.206' IDENTIFIED BY 'shopym'
flush privileges;
10、互告bin-log資訊
a、在主機1(192.168.1.2)上
mysql> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000006 | 106 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
b、在主機2(192.168.1.4)上
mysql> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000008 | 192 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
c、在主機1(172.16.1.206)上
mysql> change master to master_host='172.16.1.226',master_user='shopym',master_password='shopym',master_log_file='mysql-bin.000008',master_log_pos=120;
d、在主機2(192.168.1.226)上
mysql> change master to master_host='172.16.1.206',master_user='shopym',master_password='shopym',master_log_file='mysql-bin.000014',master_log_pos=120;
RDS 是獨特的 需要這個方法 兩邊用GTID來資料同步
change master to master_host='.rds.aliyuncs.com',master_user='0000000',master_password='1q2.......#',master_auto_position=1;
show global variables like 'gtid_purged';
然後拿著這個value,去從庫上依次
stop slave;
set global gtid_purged = 'xxx'; # xxx是你主庫上查到的value。
start slave;
進過測試RDS需要先查詢
set global gtid_purged ='077e9f57-b83f-11e6-844c-7cd30abff676:1-10479976,fa4f2610-b83e-11e6-844c-7cd30abff66a:1-5683819';
要是出現: ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty. 則需要執行: reset master;
11、在主機1、主機2兩伺服器都執行以下命令
mysql> start slave;
12、檢視狀態
主機1上(172.16.1.206)
mysql> show slave status\G;
..............
在主機2(172.16.1.206)上
mysql> show slave status\G;
.............
當看到了兩個yes,即:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
說明已經配置成功了,同時檢視主機2中是否已經有主機1中的資料庫
其他
同步資料
用test做的實驗,匯出將test.sql檔案從1.4伺服器拷貝到1.2伺服器
備份資料前先鎖表,保證資料一致性
mysql> FLUSH TABLES WITH READ LOCK;
# mysqldump -uroot -p123456 test> /tmp/test.sql;
mysql> UNLOCK TABLES;
scp /tmp/test.sql [email protected]:/tmp
在搭建mysql master-slave複製環境時,一切都正常,但是在slave上執行:show slave status\G; 時,出現下面的狀況:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
一直無法進行正確的複製。檢視錯誤日誌檔案顯示:Connecting error_code:2003
看來是slave 沒有連線上master,在網上搜索一下,網上文章大都只是指出了可能的三種錯誤:
1. 網路不通
2. 密碼不對
3. pos不對
我測試網路是可以ping通的。密碼也對,pos也對。
後來想了很久,突然想起來了防火牆好像沒有關閉!一檢查果然。
所以第四種錯誤是:
4. 防火牆沒有關閉。
相關命令如下:
關閉命令: service iptables stop
永久關閉防火牆:chkconfig iptables off
兩個命令同時執行,執行完成後檢視防火牆關閉狀態
service iptables status
另外順便也將 selinux關閉掉:
1 vi /etc/selinux/config
2 #SELINUX=enforcing #註釋掉
3 #SELINUXTYPE=targeted #註釋掉
4 SELINUX=disabled #增加
5 :wq #儲存,關閉。
6 shutdown -r now #重啟系統
檢視SELinux的狀態:
getenforce