步驟

  1. 源、基礎包安裝、防火牆關閉。
  2. 進程限制優化
  3. 下載mysql、安裝、創建用户。
  1. 修改root臨時密碼,創建root全局登錄用户
  1. 主從配置
  1. 創建主從的用户
  2. 主節點配置主從模式,日誌等信息
  3. 從節點配置主從模式,日誌,回放日誌等信息
  4. 測試驗證
  1. FAQ


源、基礎包安裝、防火牆關閉

cd /etc/yum.repos.d/
mv /etc/yum.repos.d/rocky.repo /etc/yum.repos.d/rocky.repo.bak
mv /etc/yum.repos.d/rocky-extras.repo /etc/yum.repos.d/rocky-extras.repo.bak

[root@Rocky2 yum.repos.d]# cat aliyun.repo 
[baseos-aliyun]
name=Rocky Linux $releasever - BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[appstream-aliyun]
name=Rocky Linux $releasever - AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[extras-aliyun]
name=Rocky Linux $releasever - Extras
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/extras/$basearch/os/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[crb-aliyun]
name=Rocky Linux $releasever - CRB
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/CRB/$basearch/os/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm/gpg/RPM-GPG-KEY-rockyofficial

#安裝基礎包
yum makecache
yum install -y bash-completion tree net-tools lrzsz vim tar 

#防火牆
systemctl disable --now firewalld

setenforce 0
vi /etc/selinux/config #自己設置永久關閉selinux

優化進程限制

#優化文件描述符和進程限制
[root@Rocky1 ~]# cat /etc/security/limits.conf 
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

Mysql安裝

下載地址:https://dev.mysql.com/downloads/mysql/

#查看以前是否安裝過mysql,若有卸載
rpm -qa |grep mysql
rpm -qa |grep mariadb

#解壓包
cd /usr/local/
xz -d mysql-8.0.44-linux-glibc2.28-x86_64.tar.xz 
tar xvf mysql-8.0.44-linux-glibc2.28-x86_64.tar 
rm -f mysql-8.0.44-linux-glibc2.28-x86_64.tar 

mv mysql-8.0.44-linux-glibc2.28-x86_64/ mysql

mkdir /var/lib/mysql
mkdir /usr/local/mysql/{log,data}


#添加環境變量
vi /etc/bashrc 
PATH=$PATH:/usr/local/mysql/bin

source  /etc/bashrc 
mysql -h #測試

#添加啓動程序的系統用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /var/lib/mysql
ll /var/lib/mysql/

#準備mysql配置文件
[root@Rocky2 yum.repos.d]# vi /etc/my.cnf
[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
port = 3306
socket=/var/lib/mysql/mysql.sock
basedir=/usr/local/mysql
character-set-server=utf8mb4
default-storage-engine=INNODB

innodb_buffer_pool_size = 200M
max_allowed_packet=16M
explicit_defaults_for_timestamp=1
log-output=FILE
general_log = 0
general_log_file=/usr/local/mysql/log/mysql-general.err
slow_query_log = ON
slow_query_log_file=/usr/local/mysql/log/mysql-query.err
long_query_time=10
log-error=/usr/local/mysql/log/mysql-error.err
default-authentication-plugin=mysql_native_password

#修改權限
chown mysql.mysql /etc/my.cnf 

#開始安裝
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
pwd
#記住root密碼
tail /usr/local/mysql/log/mysql-error.err 

#systemd管理
[root@Rocky2 yum.repos.d]# cat /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 65536
LimitNPROC = 65536

#啓動mysql進程
systemctl enable --now mysqld
systemctl status mysqld

#登錄數據庫,修改root臨時密碼
mysql> mysql -u root -p 
mysql> show databases;
mysql> alter user root@'localhost'  identified with mysql_native_password by 'xxxxxx';
mysql> use mysql;
mysql> status;
mysql> select user,host from user;

#創建一個root可以從其它機器登錄的用户,授權權限。
mysql> create user root@'192.168.68.1' identified with mysql_native_password by 'xxxxxx';
mysql> grant all privileges on *.* to root@'%' with grant option;
mysql>show grants for root;

mysql> select user,host from user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| root             | 192.168.68.1 |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+

主從配置

在主庫和從庫創建用户並授權
mysql -uroot -p

create user 'repuser'@'%' identified with mysql_native_password BY '123456';
grant replication client,replication slave on *.* to 'repuser'@'%';

flush privileges;
select user,host from mysql.user;


主節點操作:
#創建要二進制日誌目錄
mkdir -p /usr/local/mysql/binlog/
mkdir -p /usr/local/mysql/relaylog
chown -R mysql:mysql /usr/local/mysql/binlog/
chown -R mysql:mysql /usr/local/mysql/relaylog/
chmod -R 775 /usr/local/mysql/binlog/
chmod -R 775 /usr/local/mysql/relaylog/

#編輯配置文件
mv /etc/my.cnf /etc/my.cnf.bak
[root@Rocky2 ~]# vi /etc/my.cnf 
[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
port = 3306
socket=/var/lib/mysql/mysql.sock
basedir=/usr/local/mysql
character-set-server=utf8mb4
default-time-zone = '+08:00'
# 日誌時間戳使用系統時區
log_timestamps = SYSTEM

default-storage-engine=INNODB
innodb_buffer_pool_size = 20M
max_allowed_packet=16M
explicit_defaults_for_timestamp=1

#錯誤日誌和慢查詢日誌
log-output=FILE
general_log = 0
general_log_file=/usr/local/mysql/log/mysql-general.err
slow_query_log = ON
slow_query_log_file=/usr/local/mysql/log/mysql-query.err
long_query_time=10
log-error=/usr/local/mysql/log/mysql-error.err
default-authentication-plugin=mysql_native_password

#主從相關
bind-address=192.168.68.132
#自定義:ip第四部分+端口
server_id=323306
skip_name_resolve = ON
#保留30天的日誌文件
expire_logs_days = 30

#8.0版本不支持該參數
#innodb_support_xa = 1
binlog_cache_size = 1M
#單個文件最大大小
max_binlog_size = 1048M
log_bin_trust_function_creators = 1
innodb_flush_log_at_trx_commit =1
sync_binlog = 1

transaction-isolation = READ-COMMITTED
gtid_mode = ON
enforce_gtid_consistency = 1
log-slave-updates = 1
binlog_gtid_simple_recovery=1

#主從二進制日誌
log_bin=/usr/local/mysql/binlog/mysql-binlog
log_bin_index=/usr/local/mysql/binlog/mysql-binlog.index
binlog_format=ROW
binlog_rows_query_log_events=on

plugin_dir=/usr/local/mysql/lib/plugin/
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1

#重啓進程
systemctl stop mysqld
systemctl start mysqld
參數解析:

上面的參數含義

bind-address=192.168.1.51   
#*服務器偵聽通配符 指定的所有 IPv4 或 IPv6 地址。
#多個ip用逗號隔開,多個ip的時候,不允許其中一個使用通配符。可以寫0.0.0.0
#IPV4,IPV6可以一起配置。

server_id=513306  #節點id,主從不相同,規範建議:ip第四位+端口。
skip_name_resolve = off #跳過主機名,域名解析。
expire_logs_days = 30 #binlog日誌保留多少天
innodb_support_xa =1 	#在主庫上設置,默認是自動開啓。看到XA首先想到的是分佈式事務,這個參數確保事務日誌寫入bin-log的順序與事務的time-line是一致的。這樣在系統崩潰的時候,啓用日誌恢復,可以嚴格按照時間線來恢復數據庫。

binlog_cache_size = 1M #默認32K,binlog緩存大小,設置時要當心,建議1-4M,根據業務繁忙情況。
max_binlog_size = 1048M #默認日誌大小
log_bin_trust_function_creators = 1 #默認是0,表示關閉同步函數和存儲過程。
innodb_flush_log_at_trx_commit =1 #默認,每次事務提交時mysql都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中
sync_binlog = 1

transaction-isolation = READ-COMMITTED  #事務隔離級別,設置成讀已提交

#關於GTID參數
gtid_mode = ON  
#-on產生GITD,slave只接受GTID的事務。
#-ON_PERMISSIVE,產生GTID,slave接受不帶GTID事務,也接受GTID的事務。
#-OFF。不產生GTID,slave只接受不帶參GTID的事務。
#-OFF_PERMISSIVE。不產生GTID,slave接受不帶GTID事務,也接受帶GTID的事務。

enforce_gtid_consistency = 1
#on(1):當發現語句、事務不支持GTID時,返回錯誤信息
#WARN: 當發現不支持語句、事務,返回警告,並在日誌中記錄告警信息。
#OFF:不檢查是否有GTID不支持語句、事務。

log-slave-updates = 1
#當參數沒有開啓,從庫的binlog不會記錄來源於主庫的操作記錄。只有開啓參數,從庫binlog才會記錄主庫同步的操作日誌。如果是多個從庫,切換後,建議關掉log-slave-updates參數,否則重置成主庫以後,可能會將已經執行過的二進制日誌重複傳送個slave2,導致slave2同步錯誤。

binlog_gtid_simple_recovery=1
#默認是1,這個參數控制mysql啓動或重啓時,mysql在搜尋GTID時是如何迭代使用binlog文件的。這個選修為真,會提升mysql執行恢復的性能,因為這樣mysql-server啓動和binlog日誌清理更快。

gtid_executed_compression_period #控制表壓縮率,默認就好。
gtid_next:automatic  #gtid獲取下一個事務的方式,automatic為自動獲取,當出現slave故障需要跳過某事務的時候,這裏可以指定事務的ID。set global gtid_next='xxx'

gtid_owned #表示正在執行事務的gtid以及對應的線程ID
gtid_purged #已經被刪除的binlog事務,它是GTID_EXECUTED的子集,從mysql5.6.9開始,該變量無法被設置。
session_track_gtids #控制用於捕獲GTID和在OK PACKE返回的追蹤器。
#OFF 表示關閉
#OWN_GTID返回當前事務產生的GTID
#ALL_GTIDS 返回系統執行的所有GTID,也就是GTID_EXECUTED

log_bin=/mysql/log/3306/binlog/itpuxdb-binlog  #二進制日誌路徑
log_bin_index=/mysql/log/3306/binlog/itpuxdb-binlog.index  #二進制日誌索引路徑
binlog_format=ROW # #二進制日誌文件格式是行(必須),還有其它值,後面解析。
binlog_rows_query_log_events=on  #二進制日誌記錄更詳細的sql操作。

#關於同步方式參數
plugin_dir=/mysql/app/mysql/lib/plugin/
plugin_load = 
"rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1 #mysql5.6開啓主的半同步複製(rpl_semi_sync_master_enabled)。

loose_rpl_semi_sync_slave_enabled = 1 #mysql5.6開啓從的半同步複製(rpl_semi_sync_slave_enabled)。

loose_rpl_semi_sync_master_timeout = 5000 #超時5秒,切回異步。
rpl_semi_sync_master_wait_point = AFTER_SYNC #mysql5.7的方法,開啓無損複製。AFTER_COMMIT值,表示開啓半同步複製。
rpl_semi_sync_master_wait_for_slave_count = 1 #至少收到1個slave發回的ack


從節點配置:
#創建二進制日誌目錄
mkdir -p /usr/local/mysql/binlog/
mkdir -p /usr/local/mysql/relaylog
chown -R mysql:mysql /usr/local/mysql/binlog/
chown -R mysql:mysql /usr/local/mysql/relaylog/
chmod -R 775 /usr/local/mysql/binlog/
chmod -R 775 /usr/local/mysql/relaylog/

#編輯配置
[root@Rocky3 mysql]# vi /etc/my.cnf
[mysql]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
port = 3306
socket=/var/lib/mysql/mysql.sock
basedir=/usr/local/mysql
character-set-server=utf8mb4
default-time-zone = '+08:00'
# 日誌時間戳使用系統時區
log_timestamps = SYSTEM

default-storage-engine=INNODB
innodb_buffer_pool_size = 20M
max_allowed_packet=16M
explicit_defaults_for_timestamp=1

#錯誤日誌和慢查詢日誌
log-output=FILE
general_log = 0
general_log_file=/usr/local/mysql/log/mysql-general.err
slow_query_log = ON
slow_query_log_file=/usr/local/mysql/log/mysql-query.err
long_query_time=10
log-error=/usr/local/mysql/log/mysql-error.err
default-authentication-plugin=mysql_native_password

#主從相關,從修改地址
bind-address=192.168.68.133
#自定義:ip第四部分+端口
server_id=333306
skip_name_resolve = ON
#保留30天的日誌文件
expire_logs_days = 30

#8.0版本不支持該參數
#innodb_support_xa = 1
binlog_cache_size = 1M
#單個文件最大大小
max_binlog_size = 1048M
log_bin_trust_function_creators = 1
innodb_flush_log_at_trx_commit =1
sync_binlog = 1

transaction-isolation = READ-COMMITTED
gtid_mode = ON
enforce_gtid_consistency = 1
log-slave-updates = 1
binlog_gtid_simple_recovery=1

#主從二進制日誌
log_bin=/usr/local/mysql/binlog/mysql-binlog
log_bin_index=/usr/local/mysql/binlog/mysql-binlog.index
binlog_format=ROW
binlog_rows_query_log_events=on
#從添加參數:回放日誌,只讀
relay_log = /usr/local/mysql/relaylog/relay.log
read_only=1

plugin_dir=/usr/local/mysql/lib/plugin/
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1
systemctl status mysqld
systemctl restart mysqld

在從節點上,連接主節點:

mysql -uroot -p   #如果有以前有配置過,重置掉
stop slave; 
reset master;
reset slave all;

#設置連接master信息,端口,同步使用的賬號,是否只同步某個庫,或者某個表等信息,都可以在這裏設置。
change master to master_host='192.168.68.132',master_port=3306,master_user='repuser',master_password='123456',master_auto_position=1;

#master_auto_position=1 表示從第一個位置開始

start slave;

show slave status \G;
show slave status;
SHOW PROCESSLIST;  #小寫也可以
show slave hosts;  #查看有幾個從庫

show slave status \G;  #在從庫執行,看到IO ,SQL線程必須都是run,而且IO_State是: Waiting for master to send event
驗證

在主庫操作,插入數據,在從庫看下效果。

主庫:
create database itpuxdb1;
create user 'itpux01'@'%' identified with mysql_native_password by 'itpux01';
grant all privileges on itpuxdb1.* to 'itpux01'@'%';
flush privileges;
use itpuxdb1;
create table itpuxbak11 (id int,name varchar(40)); 
insert into itpuxbak11 values (1,'itpux111'),(2,'itpux112'),(3,'itpux113'),(4,'itpux114'),(5,'itpux115');
commit;
select * from itpuxbak11;

備庫檢查:
mysql -uitpux01 -pitpux01
select * from itpuxdb1.itpuxbak11;
insert into itpuxdb1.itpuxbak11 values (6,'itpux116');
mysql -uroot -p123456
show slave status \G
show processlist;  #如果有同步的話,這裏會看到進程在操作。