2020年9月23日 星期三

mysql 8 主備配置




1.mysql 主備配置設定


主庫配置 同步帳號

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Ron_master_1';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;


2.主庫配置 /etc/my.cnf

[mysqld]
log-bin=/mysql/data/binlogs/mysql-bin
server-id=1


3.備庫配置  /etc/my.cnf

[mysqld]
log-bin=/mysql/data/binlogs/mysql-bin
relay_log=/mysql/data/binlogs/mysql-relay-bin
server-id=2
log_slave_updates=1
read_only=1


開啟read_only
一般來說 備庫是不用配置  log-bin , 除非該slave 是 其他slave 的master 



4. 查看主庫 log 狀態

 show master status;






5.登入備庫設定 主庫的 bin 及 position 參數


CHANGE MASTER TO 
MASTER_HOST='10.10.17.27',
MASTER_USER='repl',
MASTER_PASSWORD='Ron_master_1',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=794;




確認 data 下的 auto.cnf 的 uuid 跟主庫不同
修改server-uuid

查詢show variables like '%server_uuid%';


啟動 slave 同步

start slave;


備庫查看狀態........

show slave status\G;

這邊可以看到相關的主庫資訊



Slave_io_running , slave_sql_running  都是 YES
Last_IO_Errno  ,  Last_SQL_Errno 也都是 0

表示同步啟動沒問題,,,


--------------測試數據同步




-------------- 停止 slave 同步
stop slave ;


--------------備庫指定從主庫某一個  Position 開始同步


備庫先停掉同步
stop slave ;


主備兩邊的資料目前都是一致的



接下來主庫一直做資料異動




查看 主庫   bin 及 position 參數
 show master status;






備庫開始從這一點開始進行同步

CHANGE MASTER TO 
MASTER_HOST='10.10.17.27',
MASTER_USER='repl',
MASTER_PASSWORD='Ron_master_1',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=2236;

start slave ;





主庫這時候新增一筆  id = 4



備庫 這邊只會查詢到 id = 1,2 及剛剛新增的 id = 4






不過此時要注意, 主庫刪除 id= 3 時, 因備庫沒有 id = 3
這時同步會停止且出現   Last_Errno: 1032 錯誤 
同步停在   master log mysql-bin.000001, end_log_pos 2815  





--------------解決方法1
因為我們知道 備庫是少 id = 3  , 這時候備庫手動新增 id = 3 上去


在執行 

start slave ;  同步就可以再次執行 id = 3 也被刪除了




--------------解決方法2
備庫執行show slave status\G;

裡頭的錯誤訊息

Last_SQL_Error: Could not execute Delete_rows event on table DBA.dba_test; Can't find record in 'dba_test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 2815


錯誤很明顯的跟你說 是這邊表  table DBA.dba_test  有問題且停在  master log mysql-bin.000001, end_log_pos 2815 位置


直接從主庫找 bin log 的紀錄 看看執行哪一條SQL 出現錯誤


  mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /mysql/data/mysql-bin.000001 | grep -A 200 '2815' > error_sql.txt
   




執行delete 出現錯誤, 把資料補回去備庫後, 就可以在執行同步了



Linux 7 安裝 mysql 8



1.下載及安裝

rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

rpm -Uvh https://repo.mysql.com/mysql80-community-release-el6-3.noarch.rpm


yum -y install mysql-community-server


或使用 yum 下載
下載頁面


---linux 7
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

---linux 6
wget https://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm


 
#安裝yum源
yum local install mysql80-community-release-el7-1.noarch.rpm


2.啟動mysql

------ linux 7
sudo /usr/bin/systemctl enable mysqld
systemctl start mysqld

------ linux 6
service mysqld start



3.安裝好mysql後, 找到原始的 mysql root 密碼
 cat /var/log/mysqld.log | grep password

[root@ora28 ~]# cat /var/log/mysqld.log | grep password
2020-07-24T08:47:09.576906Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: G8J=LGYtBS9D


4.使用這個密碼登入且修改密碼

mysql -u root -p
alter user 'root'@'localhost' identified by 'N.:129%eYmyk%yM';


5.設定 root帳號可遠端登入

use mysql;
update user set host='%' where user='root';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
FLUSH PRIVILEGES;



-------linux 7
#啟動mysql
systemctl start mysqld.service
 
#結束
systemctl stop mysqld.service
 
#重啟
systemctl restart mysqld.service
 
#開機自啟
systemctl enable mysqld.service


------linux 6
#啟動mysql
service mysqld start
 
#結束
service mysqld stop
 
#重啟
service mysqld reatart

#狀態
service mysqld status 

 
#開機自啟
service mysqld enable




----配置 read only 帳號

GRANT ALL PRIVILEGES ON dbtest.* TO 'requery'@'%';
GRANT SELECT ON dbtest.* TO 'requery'@'%';

----配置 DBA 帳號

CREATE USER 'dba'@'%' IDENTIFIED BY 'Qvt4c.scBnEETeX0.12';

GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create User, Create View, Delete, Drop, Event, Execute, File, Grant Option, Index, Insert, Lock Tables, Process, References, Reload, Replication Client, Replication Slave, Select, Show Databases, Show View, Shutdown, Super, Trigger, Update ON *.* TO `dba`@`%`;
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%';


alter user 'dba'@'%' identified by 'Qvt4c.scBnEETeX0.12'; 

FLUSH PRIVILEGES;





----忘記root密碼,強力登入配置密碼  ---- MySQL 8.0.11中刪除此方法

/etc/my.cnf   
輸入 skip-grant-tables


mysql -u root 

flush privileges;
alter user 'root'@'%' identified by 'Qvt4c.scBnEETeX0.12'; 
flush privileges;

/etc/my.cnf   
拿掉 skip-grant-tables



----- 修改mysql資料存放的路徑
關閉mysql 
systemctl stop mysqld

配置新資料夾
mkdir /mysql
mkdir /mysql/data
mkdir /mysql/data/binlogs
mkdir /mysql/log
mkdir /mysql/software
echo "" > /mysql/log/mysqld.log


chown -R mysql:mysql /mysql/


修改 /etc/my.cnf


datadir=/mysql/data
socket=/mysql/data/mysql.sock

log-error=/mysql/log/mysqld.log

log-bin=/mysql/data/binlogs/mysql-bin



將原本資料使用的移去新的資料夾
cp -rp /var/lib/mysql/* /mysql/data/

修改安全配置
setenforce 0
vi /etc/selinux/config 檔案中設定 SELINUX=disabled 


啟動mysql
systemctl start mysqld





-----------移除 mysql
yum remove mysql-libs mysql-server mysql-client mysql



----------mysql 備庫開啟 read only 模式

備庫查詢
show global variables like "%read_only%";

set global read_only=1;



ON= 開啟read only
但對於super user 是無效的, super user 是可以對資料庫讀寫


備庫執行
flush tables with read lock;

super user 就不能對資料庫讀寫, 但相對的備庫就不能從主庫同步資料過來

相對的解鎖指令
unlock tables;




--------------設定用戶密碼強度

show variables like '%password%'

-----可允許低強度
set global validate_password.policy=0;
   
---長度最少4
set global validate_password.length=4;