溫馨提示×

溫馨提示×

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

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

MYSQL5.6.40源碼安裝 主從搭建 主主搭建

發(fā)布時(shí)間:2020-08-10 15:17:52 來源:ITPUB博客 閱讀:180 作者:germany006 欄目:MySQL數(shù)據(jù)庫

前言:
前面那篇5.6.38主從搭建的文章屬于測試系統(tǒng)里面弄著玩的,以下這篇文章寫的是在公司生產(chǎn)庫上搭建的MYSQL主從。
在上系統(tǒng)前,糾結(jié)了很久,到底使用哪種數(shù)據(jù)庫(PG?HBASE?MONGODB?)?最后選擇了MYSQL是由于公司懂的人多,自己也比較熟悉,且新項(xiàng)目初期數(shù)據(jù)量不大,MYSQL可以滿足需求,最最重要的是這個(gè)新項(xiàng)目屬于探路性質(zhì)的,如果真的被重視起來,那到時(shí)再把數(shù)據(jù)遷移出去就好了(基于開發(fā)說的數(shù)據(jù)結(jié)構(gòu)簡單單一,存儲(chǔ)數(shù)據(jù)單一的情況,沒有特別的數(shù)據(jù)類型等)。
所以最終選擇了開源數(shù)據(jù)庫中的一員MYSQL。(本來還有考慮ORACLE的,老本行,只不過考慮到領(lǐng)導(dǎo)們支持開源,那就用開源吧)

之前也糾結(jié)了要不要使用mysql5.7.22,結(jié)果去下載了安裝,發(fā)現(xiàn)redhat6.5的cmake版本太低,不支持mysql5.7.22的編譯,一下子又沒找到redhat7的安裝包,干脆就用mysql5.6.40這個(gè)5.6的最終穩(wěn)定版算了。

操作系統(tǒng),網(wǎng)卡,防火墻,IP地址配置等等在這里就不寫了。 一、MYSQL源碼安裝
(兩個(gè)節(jié)點(diǎn)都安裝,步驟一樣的)

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

NODE1 主機(jī)名 master      IP地址 192.168.159.148

NODE2 主機(jī)名 slave       IP地址 192.168.159.149


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.6.40源碼包
https://downloads.mysql.com/archives/get/file/mysql-5.6.40.tar.gz
4、解壓tar -zxvf mysql-5.6.40.tar.gz

cd /opt/

tar -zxvf mysql-5.6.40.tar.gz

cd  mysql-5.6.40

5、編譯安裝
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc-DWITH_MYISAM_STORAGE_ENGINE=1-DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_MEMORY_STORAGE_ENGINE=1-DWITH_READLINE=1-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306-DENABLED_LOCAL_INFILE=1-DWITH_PARTITION_STORAGE_ENGINE=1-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
說明:
設(shè)置安裝目錄
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
數(shù)據(jù)庫存放目錄
-DMYSQL_DATADIR=/usr/local/mysql/data
系統(tǒng)配置目錄
-DSYSCONFDIR=/etc
安裝 myisam 存儲(chǔ)引擎

-DWITH_MYISAM_STORAGE_ENGINE=1
安裝 innodb 存儲(chǔ)引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 
安裝memory存儲(chǔ)引擎
-DWITH_MEMORY_STORAGE_ENGINE=1
快捷鍵功能
-DWITH_READLINE=1
Unix socket文件路徑
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
MySQL 監(jiān)聽端口
-DMYSQL_TCP_PORT=3306
允許從本地導(dǎo)入數(shù)據(jù)
-DENABLED_LOCAL_INFILE=1
安裝數(shù)據(jù)庫分區(qū)
-DWITH_PARTITION_STORAGE_ENGINE=1 
安裝所有擴(kuò)展字符集
-DEXTRA_CHARSETS=all
使用 utf8 字符
-DDEFAULT_CHARSET=utf8 
校驗(yàn)字符
-DDEFAULT_COLLATION=utf8_general_ci
支持 SSL
-DWITH_SSL=yes

make &&make install

6、目錄授權(quán)
chown mysql.mysql /usr/local/mysql
mkdir /usr/local/mysql/log
chown mysql.mysql /usr/local/mysql/log
7、數(shù)據(jù)庫初始化
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
8、配置環(huán)境變量
vi /root/.bash_profile 在最后一行添加
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/mysql/lib


二、MYSQL5.6.40主從搭建

1、Master端配置部署

a、在主服務(wù)器上的my.cnf配置文件中的[mysqld]節(jié)點(diǎn)下添加以下配置

vi /etc/my.cnf

[mysqld]

server-id=101
default-storage-engine=InnoDB
lower_case_table_names=1
log-bin=/usr/local/mysql/log/mysql-bin.log
log-bin-index=/usr/local/mysql/log/mysql-bin.index
expire_logs_days=30
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/usr/local/mysql/data/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid



說明:

log-bin :給出二進(jìn)制日志的所有文件基礎(chǔ)名

log-bin-index :給出二進(jìn)制日志文件的文件名,通常以000001開始,順序遞增。全名:master-bin.000001

server-id :mysql服務(wù)器唯一ID,在主從復(fù)制的所有服務(wù)器中必須唯一。


啟動(dòng)數(shù)據(jù)庫
傳統(tǒng)啟動(dòng)方式
/usr/local/mysql/bin/mysqld_safe --user=mysql &
制作成服務(wù)啟動(dòng)
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
查看啟動(dòng)是否成功
netstat -tnl|grep 3306
ps -ef|grep mysql
相關(guān)命令
service mysql start
停止mysql服務(wù)
service mysql stop
重啟mysql服務(wù)
service mysql restart 
添加到開機(jī)啟動(dòng)項(xiàng)
chkconfig --add mysql

b、創(chuàng)建用戶,并賦予權(quán)限:
登陸數(shù)據(jù)庫時(shí)報(bào)錯(cuò)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)

ln -s /tmp/mysql.sock  /tmp/mysqld.sock

登陸
mysql -uroot

create user repl_user;

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '******';

設(shè)置密碼時(shí)會(huì)遇到報(bào)錯(cuò):

ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

解決辦法:用select password('你想輸入的密碼');查詢出你的密碼對應(yīng)的字符串

select password('123456');

查出的是*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

2、Slave端配置部署

a、配置參數(shù):[mysqld]

vi /etc/my.cnf


[mysqld]
server-id=102
default-storage-engine=InnoDB
lower_case_table_names=1
log-bin=/usr/local/mysql/log/mysql-bin.log
log-bin-index=/usr/local/mysql/log/mysql-bin.index
expire_logs_days=30
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/usr/local/mysql/data/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid


3、建立主從同步

(重建備庫也是使用該方法)

建立主從同步可以從主庫上導(dǎo)出數(shù)據(jù),也可以從已有的從庫上導(dǎo)出數(shù)據(jù),然后再導(dǎo)入到新的從庫中,change master to建立同步。

(如果是新搭建主從,可以直接按照安裝主庫的方法直接安裝從庫就可以了,都是全新的,就不需要做下面的導(dǎo)出和導(dǎo)入操作)

3.1 、導(dǎo)出數(shù)據(jù)

在主庫上導(dǎo)出數(shù)據(jù):

mysqldump -u***-p***-S /data/mysql6001/mysql.sock        --default-character-set=utf8 –q --single-transaction --master-data-A >  /tmp/all_database.sql

(或者)在從庫上導(dǎo)出數(shù)據(jù):

mysqldump -u***-p***-S /data/mysql6001/mysql.sock --default-character-set=utf8 -q --single-transaction --dump-slave-A  >  /tmp/all_database.sql

NOTES:

--master-data和--dump-slave導(dǎo)出的備份中,會(huì)包含master_log_file和master_log_pos信息。


例子:

mysqldump -uroot --events --all-databases > /opt/mysql.dump




3.2、從庫導(dǎo)入數(shù)據(jù)

mysql -u*** -p*** --default-character-set=utf8< all_database.sql


例子:

mysql -uroot -p*** <  /opt/mysql.dump


3.3、從庫與主機(jī)建立同步

以下為建立主從同步最基本的6個(gè)項(xiàng):change master to

master_host='xxx.xxx.xxx.xxx',    # 主庫IP

master_port=6001,              # 主庫mysqld的端口

master_user='repl',             # 主庫中創(chuàng)建的有REPLICATION SLAVE權(quán)限的用戶

master_password='xxxxxxxx',      # 該用戶的密碼

master_log_file='mysql-bin.000xxx', # 已在導(dǎo)入時(shí)指定了

master_log_pos=xxxxxx;       #已在導(dǎo)入時(shí)指定了

start slave;


例子:

master_log_file和master_log_pos通過在主庫上使用命令獲得:

show master status \G;

在從庫上執(zhí)行:

change master to

master_host='192.168.159.148',

master_port=3306,

master_user='repl_user',

master_password='123456',

master_log_file='mysql-bin.000002',

master_log_pos=415;

start slave;


驗(yàn)證主從是否搭建成功在從庫執(zhí)行
show slave status \G 
在主庫創(chuàng)建一個(gè)表
use test
create table aa (name char(10));
insert into aa values('Tom');
在從庫查詢
use test
select * from aa;
查到剛剛插入的數(shù)據(jù)就O了

修改root密碼

cd /usr/local/ mysql /bin

./mysqladmin -u root password


mysql> use mysql;
mysql> desc user;
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; //授權(quán)遠(yuǎn)程連接
mysql> update user set Password = password('123456') where User='root'; //設(shè)置root用戶密碼
mysql> select Host,User,Password from user where User='root';
mysql> flush privileges;
mysql> exit

二、MYSQL5.6.40主主搭建
前面的安裝配置都一樣,只需要配置/etc/my.cnf

1、主庫A配置(192.168.159.148)
vi /etc/my.cnf

[client]
port = 3306 socket = /tmp/mysql.sock
[mysqld]
basedir = /usr/local/mysql
port = 3306 socket = /tmp/mysql.sock
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/data/mysql.pid
log-error = /usr/local/mysql/data/mysql.err
server-id = 1 auto_increment_offset = 1 auto_increment_increment = 2 #奇數(shù)ID
log-bin = mysql-bin                                                     #打開二進(jìn)制功能,MASTER主服務(wù)器必須打開此項(xiàng)
binlog-format=ROW
#binlog-row-p_w_picpath=minimal  #這個(gè)參數(shù)不知道為何會(huì)報(bào)錯(cuò)
log-slave-updates=true gtid-mode=on
enforce-gtid-consistency=true master-info-repository=TABLE
relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32
master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M                                                   #binlog單文件最大值
replicate-ignore-db = mysql                                             #忽略不同步主從的數(shù)據(jù)庫
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = zabbix
max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake                                     #忽略應(yīng)用程序想要設(shè)置的其他字符集
init-connect='SET NAMES utf8' #連接時(shí)執(zhí)行的SQL
character-set-server=utf8                                               #服務(wù)端默認(rèn)字符集
wait_timeout=1800 #請求的最大連接時(shí)間
interactive_timeout=1800 #和上一參數(shù)同時(shí)修改才會(huì)生效
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES                     #sql模式
max_allowed_packet = 10M
bulk_insert_buffer_size = 8M
query_cache_type = 1 query_cache_size = 128M
query_cache_limit = 4M
key_buffer_size = 256M
read_buffer_size = 16K
skip-name-resolve
slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log
innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysqldump]
quick
max_allowed_packet = 16M
[mysqld_safe]



2、主庫B配置(192.168.159.149)
vi /etc/my.cnf

[client]
port = 3306 socket = /tmp/mysql.sock
[mysqld]
basedir = /usr/local/mysql
port = 3306 socket = /tmp/mysql.sock
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/data/mysql.pid
log-error = /usr/local/mysql/data/mysql.err
server-id = 2 auto_increment_offset = 2 auto_increment_increment = 2 #偶數(shù)ID
log-bin = mysql-bin                                                     #打開二進(jìn)制功能,MASTER主服務(wù)器必須打開此項(xiàng)
binlog-format=ROW
#binlog-row-p_w_picpath=minimal #這個(gè)參數(shù)不知道為何會(huì)報(bào)錯(cuò) log-slave-updates=true gtid-mode=on
enforce-gtid-consistency=true master-info-repository=TABLE
relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32
master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M                                                   #binlog單文件最大值
replicate-ignore-db = mysql                                             #忽略不同步主從的數(shù)據(jù)庫
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = zabbix
max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake                                     #忽略應(yīng)用程序想要設(shè)置的其他字符集
init-connect='SET NAMES utf8' #連接時(shí)執(zhí)行的SQL
character-set-server=utf8                                               #服務(wù)端默認(rèn)字符集
wait_timeout=1800 #請求的最大連接時(shí)間
interactive_timeout=1800 #和上一參數(shù)同時(shí)修改才會(huì)生效
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES                     #sql模式
max_allowed_packet = 10M
bulk_insert_buffer_size = 8M
query_cache_type = 1 query_cache_size = 128M
query_cache_limit = 4M
key_buffer_size = 256M
read_buffer_size = 16K
skip-name-resolve
slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log
innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysqldump]
quick
max_allowed_packet = 16M
[mysqld_safe]

3、主庫A(192.168.159.148)創(chuàng)建同步用戶

mysql> grant replication slave on *.* to 'repl'@'192.168.159.149' identified by '123456';
mysql> flush privileges;


4、主庫B(192.168.159.149) 創(chuàng)建同步用戶

mysql> grant replication slave on *.* to 'repl'@'192.168.159.148' identified by '123456';
mysql> flush privileges;


5、 主庫A(192.168.159.148 配置同步信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                   |
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
| mysql-bin.000003 |     2552 |              |                  | 7b0fba4f-5cd4-11e8-bada-000c29ba59e8:1-20,
a1788b59-5d6a-11e8-bead-000c295d547a:3-9 |
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.159.149',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=1727;

mysql > start slave;

mysql> show slave status \G;

注意看其中的這兩個(gè)狀態(tài)是YES就是正常

Slave_IO_Running: Yes
Slave_SQL_Running: Yes



6、 主庫A(192.168.159.149 配置同步信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                         |
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+
| mysql-bin.000004 |     1727 |              |                  | 7b0fba4f-5cd4-11e8-bada-000c29ba59e8:8-10:16-20,
a1788b59-5d6a-11e8-bead-000c295d547a:1-9 |
+------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)


mysql> change master to master_host='192.168.159.148',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=2552;

mysql > start slave;

mysql > show slave status \G;
注意看其中的這兩個(gè)狀態(tài)是YES就是正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

7、檢測主主同步
可以在A庫創(chuàng)建一個(gè)database 然后在B庫看是否同步,再去B庫創(chuàng)建一個(gè)database然后在A庫看是否同步。
注意事項(xiàng):
mysql異常宕機(jī)情況下,如果未設(shè)置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出現(xiàn)binlog或者relaylog文件出現(xiàn)損壞,導(dǎo)致主從不一致。

--未完待續(xù)

8、MYSQL啟動(dòng)報(bào)錯(cuò)

(1)

報(bào)錯(cuò)現(xiàn)象:

[root@node1 mysql]# service mysql start

Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid).

查看報(bào)錯(cuò)日志:

[root@node1 mysql]# tail  /var/log/mysqld.log 

190512 19:59:10  InnoDB: Starting an apply batch of log records to the database...

InnoDB: Progress in percents: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 

InnoDB: Apply batch completed

190512 19:59:10  InnoDB: Waiting for the background threads to start

190512 19:59:11 InnoDB: 5.5.40 started; log sequence number 1595675

190512 19:59:11 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306

190512 19:59:11 [Note]   - '0.0.0.0' resolves to '0.0.0.0';

190512 19:59:11 [Note] Server socket created on IP: '0.0.0.0'.

190512 19:59:11 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

190512 19:59:11 mysqld_safe mysqld from pid file /var/lib/mysql/node1.pid ended



解決方法:

查看配置文件,發(fā)現(xiàn)配置文件中datadir目錄是默認(rèn)的,需要修改成自己設(shè)置的/usr/local/mysql/data/

[root@node1 mysql]# cat /etc/my.cnf 

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


[mysqld_safe]

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

pid-file=/var/run/mysqld/mysqld.pid

[root@node1 mysql]# vi /etc/my.cnf 

datadir=/usr/local/mysql/data/

修改完成后重新啟動(dòng)MYSQL成功

[root@node1 mysql]# service mysql start

Starting MySQL.. SUCCESS! 



(2)

報(bào)錯(cuò)現(xiàn)象:

[root@node1 mysql]# /usr/local/mysql/bin/mysql -uroot

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)


查看配置文件發(fā)現(xiàn)socket文件在/var/lib/mysql/mysql.sock,而不是在 /tmp/mysql.sock

[root@node1 mysql]# cat /etc/my.cnf 

[mysqld]

datadir=/usr/local/mysql/data/

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


[mysqld_safe]

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

pid-file=/var/run/mysqld/mysqld.pid


解決方法:
設(shè)置軟鏈接

ln -s /var/lib/mysql/mysql.sock  /tmp/mysql.sock


或者,修改配置文件



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

vi /etc/my.cnf

[mysqld]

default-time_zone = '+8:00'

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


生產(chǎn)環(huán)境還要注意連接數(shù)的設(shè)置(操作系統(tǒng)也要設(shè)置)

max_connections=3000


像以下這個(gè)范例就可以

[mysqld]

basedir=/XXX/ 自己填寫

datadir=/XXX/自己填寫

max_connections=3000

default-storage-engine=INNODB

character-set-server=utf8

slow_query_log_file = /XXX/ 自己填寫 /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

default-time_zone = '+8:00'



#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



補(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)也可以,或者對數(shù)據(jù)安全要求不高),這樣設(shè)置的好處是提高IO性能,面對大并發(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)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI