溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MYSQL5.7.22 源碼安裝 主從搭建

發(fā)布時(shí)間:2020-08-05 03:13:08 來源:ITPUB博客 閱讀:175 作者:germany006 欄目:MySQL數(shù)據(jù)庫

操作系統(tǒng)版本

CENTOS7.6

MYSQL5.7.22

啥?為啥我的操作系統(tǒng)木有iso的安裝鏡像,哎算了,不能弄本地yum源,那就弄個(gè)網(wǎng)絡(luò)的吧。只不過默認(rèn)的用不了,那就自己動(dòng)手豐衣足食

cd /etc/yum.repos.d/

mkdir bak

cp *.repo  bak/

# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

-bash: wget: 未找到命令

WTF?原來是

原本的CentOS-Base.repo已被刪除,所以沒辦法安裝wget命令,所以用curl -O來獲取

#curl -O  http://mirrors.163.com/.help/CentOS7-Base-163.repo

vi CentOS7-Base-163.repo

替換一些東西,不然可能無法使用

:%s#$releasever#7#g

yum list

OK!YUM源搞定了,下面開始搭建MYSQL

一、MYSQL源碼安裝 
(兩個(gè)節(jié)點(diǎn)都安裝,步驟一樣的) 

安裝環(huán)境: 
操作系統(tǒng)CENTOS7.6

NODE1 主機(jī)名 tsdb1      IP地址 192.168.159.4

NODE2 主機(jī)名 tsdb2       IP地址 192.168.159.5


1、安裝依賴 
yum -y install make gcc-c++ cmake bison-devel  ncurses-devel perl 
2、創(chuàng)建用戶和組  
groupadd mysql 
useradd mysql -g mysql -M -s /sbin/nologin 
3、下載5.7.22源碼包 
https://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

4、解壓tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

cd /opt/

tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C  /home/

cd /home/

mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql5.7.22

5、安裝

mkdir -p /home/mysql5.7.22/data/

cd /home/

ln -s mysql5.7.22 mysql

cd mysql

chown -R mysql:mysql ./

./bin/mysqld --initialize --user=mysql --basedir=/home/mysql5.7.22/ --datadir=/home/mysql5.7.22/data/ --lc_messages_dir=/home/mysql5.7.22/share --lc_messages=en_US


.

./bin/mysqld --initialize --user=mysql --basedir=/home/mysql5.7.22/ --datadir=/home/mysql5.7.22/data/ --lc_messages_dir=/home/mysql5.7.22/share --lc_messages=en_US

2019-05-25T13:01:50.716538Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

2019-05-25T13:01:51.897953Z 0 [Warning] InnoDB: New log files created, LSN=45790

2019-05-25T13:01:52.039050Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.

2019-05-25T13:01:52.116959Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 43c9f84c-7eed-11e9-a241-fefcfe4975bb.

2019-05-25T13:01:52.118956Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.

2019-05-25T13:01:52.119626Z 1 [Note] A temporary password is generated for root@localhost: kar)*.OtV4F)

安裝速度賊快,刷~~~的一下就完事了。

kar)*.OtV4F)

這個(gè)是自動(dòng)生成的臨時(shí)密碼

(如果看到有報(bào)這個(gè)錯(cuò)的直接安裝就好)
bin/mysqld: error while loading shared libraries:  libaio.so.1: cannot open shared object file: No such file or directory

解決方法: yum install -y libaio   //安裝后再去初始化就OK了)

#將mysql/目錄下除了data/目錄的所有文件,改回root用戶所有
chown -R root .
#mysql用戶只需作為mysql-5.7.22/data/目錄下所有文件的所有者
chown -R mysql data

5.復(fù)制啟動(dòng)文件

cd /home/mysql/

cp ./support-files/mysql.server /etc/init.d/mysqld

chmod 755 /etc/init.d/mysqld

cp ./bin/my_print_defaults /usr/bin/ 

6.修改啟動(dòng)腳本

vi /etc/init.d/mysqld
#修改項(xiàng):
basedir= /home/mysql5.7.22/

datadir= /home/mysql5.7.22/data/
port=3306

#加入環(huán)境變量,編輯 /etc/profile,這樣可以在任何地方用mysql命令了
vi /etc/profile
#添加mysql路徑,加入下面內(nèi)容,按ESC-->:wq保存
export PATH=$PATH:/home/mysql5.7.22/bin

source /etc/profile

7.修改mysql配置項(xiàng)

vi /etc/my.cnf

[mysqld]
basedir =  /home/mysql5.7.22

datadir =  /home/mysql5.7.22/data

 8.啟動(dòng)mysql

service mysqld start

有遇到無法啟動(dòng)的情況,第一是將配置文件修改成上面簡(jiǎn)單的方式,第二是刪除data目錄下的文件,重新初始化。

mysql -uroot -pkar)*.OtV4F)

遇到無法啟動(dòng)報(bào)錯(cuò)的情況,例如:

2019-12-31T07:49:42.258557Z 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

2019-12-31T07:49:42.259636Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.

2019-12-31T07:49:42.259803Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key

2019-12-31T07:49:42.260385Z 0 [Note] Server hostname (bind-address): '*'; port: 3306

2019-12-31T07:49:42.260446Z 0 [Note] IPv6 is available.

2019-12-31T07:49:42.260462Z 0 [Note]   - '::' resolves to '::';

2019-12-31T07:49:42.260487Z 0 [Note] Server socket created on IP: '::'.

2019-12-31T07:49:42.261927Z 0 [Note] InnoDB: Loading buffer pool(s) from /data/mysql/mysql/ib_buffer_pool

2019-12-31T07:49:42.262277Z 0 [Note] InnoDB: Buffer pool(s) load completed at 191231 15:49:42

2019-12-31T07:49:42.264556Z 0 [Warning] Failed to open optimizer cost constant tables

2019-12-31T07:49:42.264839Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

2019-12-31T07:49:42.264937Z 0 [ERROR] Aborting

(遇到這個(gè)報(bào)錯(cuò)問題,有可能是因?yàn)榘惭b目錄設(shè)置不對(duì)導(dǎo)致的,我試過自己重新安裝

一個(gè)測(cè)試庫,然后沒有按筆記上的目錄設(shè)置,自己設(shè)置了新的不同的目錄如下,

[mysqld] 

basedir=/data/mysql/

datadir=/data/mysql/data/

[mysqld_safe]

log-error=/var/log/mysqld.log

然后重新安裝的時(shí)候也重新設(shè)置下,如下:

./bin/mysqld --initialize --user=mysql --basedir=/data/mysql/ --datadir=/data/mysql/data/ --lc_messages_dir=/data/mysql-5.7.22-linux-glibc2.12-x86_64/share/ --lc_messages=en_US

然后安裝目錄的用戶所屬也要記得修改為mysql)

登陸后第一件事是先修改密碼,否則敲啥命令都報(bào)錯(cuò),老老實(shí)實(shí)改密碼

進(jìn)入mysql修改初始密碼,修改遠(yuǎn)程連接的用戶權(quán)限問題

alter user 'root'@'localhost' identified by 'TaB)*.Wtf4F)';   
flush privileges;    #刷新權(quán)限

mysql -uroot -pTaB)*.Wtf4F)

use mysql;

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

flush privileges;

CENTOS7.6版本開機(jī)不會(huì)自啟動(dòng),需修改權(quán)限
chmod +x /etc/rc.d/rc.local

主從搭建

主庫配置

vi /etc/my.cnf

[mysqld]

basedir=/home/mysql5.7.22/

datadir=/home/mysql5.7.22/data/

max_connections=3000

default-storage-engine=INNODB

character-set-server=utf8

slow_query_log_file = /home/mysql5.7.22/log/mysql-slow.log

slow_query_log=1

long_query_time = 5

log-queries-not-using-indexes = 1

bind-address=0.0.0.0

socket=/tmp/mysql.sock

user=mysql

#master

server-id=1

log-bin=mysql-bin

log-bin-index=mysql-bin.index

log-slave-updates=1

binlog-do-db=Master-slave

binlog-ignore-db=mysql

binlog_format=mixed

expire_logs_days=7

重啟

service mysqld restart

主庫配置同步用戶

grant replication slave on *.* to 'Master-slave'@'192.168.159.5' identified by 'TaB)*.Wtf4F)';

flush privileges;

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000002 |      601 | Master-slave | mysql            |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

從庫配置

vi /etc/my.cnf

[mysqld]

basedir = /home/mysql5.7.22

datadir = /home/mysql5.7.22/data

max_connections=3000

default-storage-engine=INNODB

character-set-server=utf8

slow_query_log_file = /home/mysql5.7.22/log/mysql-slow.log

slow_query_log=1

long_query_time = 5

log-queries-not-using-indexes = 1

bind-address=0.0.0.0

socket=/tmp/mysql.sock

user=mysql

#slave

server-id=2

log-bin= mysql-bin

relay-log= mysql-relay-bin

read->

log-slave-updates=1

replicate-do-db=Master-slave

expire_logs_days=7

重啟

service mysqld restart

在主庫查詢ID號(hào)和日志文件號(hào)

show master status;

再登陸從庫

從庫

mysql> CHANGE MASTER TO MASTER_HOST='192.168.159.4',MASTER_USER='Master-slave',MASTER_PASSWORD='TaB)*.Wtf4F)',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=601,MASTER_CONNECT_RETRY=10;

start slave;

查看

show slave status \G

這里有些地方還有疑惑,比如我在配置文件增加以下信息會(huì)無法啟動(dòng)數(shù)據(jù)庫

[mysqld_safe]

log-error=/home/mysql5.7.22/log/tsdb1_error.log

pid-file=/home/mysql5.7.22/data/tsdb1.pid

啟動(dòng)會(huì)遇到報(bào)錯(cuò)

service mysqld start

Starting MySQL. ERROR! The server quit without updating PID file (/home/mysql5.7.22/data//tsdb1.pid).

一直查資料無法解決

以上都是我根據(jù)各種網(wǎng)上資料加上自己遇到的問題,總結(jié)修改后的,只作為寫給自己的筆記,方便下次搭建的時(shí)候查看,只不過那個(gè)設(shè)置只給自己看的功能不見了。

注意一個(gè)問題,在生產(chǎn)環(huán)境,要注意時(shí)區(qū)問題

[mysqld]

default-time_zone = '+8:00'

使用北京時(shí)間的時(shí)區(qū)

error 1045密碼錯(cuò)誤

select * from mysql.user where user='root';

use mysql;

update user set authentication_string=password('123456') where user='root' and host='localhost';

update user set authentication_string=password('123456') where user='root' and host='%';

flush privileges;

error 1086密碼過期

use mysql;

update user set password_expired="N" where user="root";

flush privileges;

主從切換

mysql主從關(guān)系中,如果master宕機(jī)了,則要提升slave為主,

    等原來的主庫恢復(fù)之后,則要把老的主庫變?yōu)閺膸欤?/span>

    這樣才能盡最大可能的保證應(yīng)用層面的業(yè)務(wù)高可用性和數(shù)據(jù)的完整性。

## mysql主從切換為從主:

從庫變主庫

將要由現(xiàn)在的從庫切換為主庫:

show processlist;#  確保Slave has read all relay log;

STOP SLAVE IO_THREAD

show slave status \G;檢查IO及SQL線程是否正常,如果為NO表明同步不一致

stop slave;

reset master;

reset slave all;(看版本號(hào))

grant replication slave on *.* repl@'IP' identified by '密碼';

show master status;#記住這里列出的log_file和log_pos信息

------------------------------------------------------------------------------

## 主庫變從庫

將要由現(xiàn)在的主庫切換成從庫

Reset master;(新的slave,老的master)

Reset slave;

change master to master_host="IP",

master_port=3306,

master_user="repl",

master_password="密碼",

master_log_file="...",#上一步中列出的log_file

master_log_pos="...";#上一部中列出的log_pos

start slave;

show slave status\G;

目前只是基礎(chǔ)搭建,還有很多優(yōu)化的參數(shù)沒有驗(yàn)證測(cè)試,后續(xù)再補(bǔ)上

補(bǔ)充一下:

MYSQL還有一個(gè)和性能有關(guān)的關(guān)鍵參數(shù),生產(chǎn)環(huán)境遇到的一個(gè)性能問題

innodb_flush_log_at_trx_commit

該參數(shù)控制重做日志寫入磁盤的過程。我們知道 InnoDB 使用“Write Ahead Log”策略來避免數(shù)據(jù)丟失問題,即依靠重做日志來保證數(shù)據(jù)能在丟失后進(jìn)行恢復(fù)。因此,InnoDB 重做日志的持久化非常重要。

該參數(shù)的有效值有 0、1、2:

0:事務(wù)提交時(shí),不將重做日志緩沖寫入磁盤,而是依靠 InnoDB 的主線程每秒執(zhí)行一次刷新到磁盤。因此如果 MySQL 發(fā)生宕機(jī),那么就有可能丟失一部分事務(wù)。

1:事務(wù)提交時(shí),會(huì)將重做日志緩沖寫入磁盤,并且立即刷新(fsync())。注意,因?yàn)椴僮飨到y(tǒng)的“延遲寫”特性,此時(shí)的刷入只是寫到了操作系統(tǒng)的緩沖區(qū)中,因此執(zhí)行同步操作才能保證一定持久化到了硬盤中。

2:事務(wù)提交時(shí),會(huì)將重做日志緩沖寫入磁盤,但是不會(huì)立即進(jìn)行刷新操作,因此只是寫到了操作系統(tǒng)的緩沖區(qū)。此時(shí)若操作系統(tǒng)發(fā)生宕機(jī)而沒有即使的同步,也可能會(huì)丟失一部分?jǐn)?shù)據(jù)。

可以看到,只有1才能真正地保證事務(wù)的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我們知道寫磁盤的速度是很慢的,因此 MySQL 的性能會(huì)明顯地下降。如果不在乎事務(wù)丟失,,0和2能獲得更高的性能。

sync_binlog

該參數(shù)控制著二進(jìn)制日志寫入磁盤的過程。

該參數(shù)的有效值為0 、1、N:

0:默認(rèn)值。事務(wù)提交后,將二進(jìn)制日志從緩沖寫入磁盤,但是不進(jìn)行刷新操作(fsync()),此時(shí)只是寫入了操作系統(tǒng)緩沖,若操作系統(tǒng)宕機(jī)則會(huì)丟失部分二進(jìn)制日志。

1:事務(wù)提交后,將二進(jìn)制文件寫入磁盤并立即執(zhí)行刷新操作,相當(dāng)于是同步寫入磁盤,不經(jīng)過操作系統(tǒng)的緩存。

N:每寫N次操作系統(tǒng)緩沖就執(zhí)行一次刷新操作。

二進(jìn)制日志文件涉及到數(shù)據(jù)的恢復(fù),以及想在主從之間獲得最大的一致性,那么應(yīng)該將該參數(shù)設(shè)置為1,但同時(shí)也會(huì)造成一定的性能損耗。

通常,會(huì)將這兩個(gè)參數(shù)都設(shè)置成1來保證數(shù)據(jù)的安全,但是如果在某些情況下性能更重要,那么可以考慮將其設(shè)為其他值來獲得最大的性能。

設(shè)置為1,最安全,但是有較大的性能損失;

設(shè)置為0,效率最高,但是最不安全;

設(shè)置為2,只要操作系統(tǒng)不崩潰,數(shù)據(jù)不會(huì)丟失;

一般有主從架構(gòu)可設(shè)置為(主主架構(gòu)也可以,或者對(duì)數(shù)據(jù)安全要求不高),這樣設(shè)置的好處是提高IO性能,面對(duì)大并發(fā)也有一定的性能提升

innodb_flush_log_at_trx_commit=2

sync_binlog=0

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI