建議使用percona server linux generic版,從https://www.percona.com/downloads/Percona-Server-LATEST/下載,現在不在推薦使用mariadb是因為考慮到mariadb的越來越不兼容mysql原生。
對於操作系統,僅推薦rhel以及centos,優先推薦客戶使用rhel(如果客戶買了服務的話,否則centos,不然yum沒法使用,依賴包的安裝會及其麻煩),且生產環境我們僅使用他們,不會使用windows,極少使用suse。
對於mysql 8.0而言,沒有ssl 101版本,如下:
此時需要升級ssl到102(自帶的很可能是101),參見linux下openssl升級指南。否則在初始化的時候會報找到openssl相關庫,如openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory。
下載后解壓、創建符號鏈接,ln -s Percona-Server-5.7.22-22-Linux.x86_64.ssl101 mysql。
[root@v-03-01-00223 mysql]# mkdir data
# 對於mariadb 10.0、10.1、10.2、10.3需要使用scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql 進行初始化,不支持5.7版本的mysqld初始化,雖然10.1之后是5.7的分支
[root@v-03-01-00223 mysql]# bin/mysqld --initialize-insecure --datadir=/usr/local/app_1/mysql/data --basedir=/usr/local/app_1/mysql
2018-07-03T00:00:30.132880Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-07-03T00:00:31.585743Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-07-03T00:00:31.775344Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-07-03T00:00:31.855871Z 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: 1a4f5171-7e54-11e8-96ba-00163e0d56df.
2018-07-03T00:00:31.859229Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-07-03T00:00:32.356281Z 0 [Warning] CA certificate ca.pem is self signed.
2018-07-03T00:00:32.636774Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
[root@v-03-01-00223 mysql]# chown -R mysql:mysql data
[root@v-03-01-00223 mysql]# ./mysqld_safe --defaults-file=/etc/my.cnf.57 --user=mysql #/etc/my.cnf.57中的主要參數推薦見下文
[root@v-03-01-00223 mysql]# ./mysql --defaults-file=/etc/my.cnf.57 -uroot -h127.0.0.1 -P3308 #因為一台服務器安裝了多個mysql實例,所以指定配置文件和端口號,defaults-file限制只讀取指定的配置文件,且必須是第一個命令行選項,否則忽略
alter user root@'localhost' identified by '123456';
create user root@'127.0.0.1' identified by '123456';
grant all on *.* to root@'127.0.0.1';
mysql> create user root@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@'%';
Query OK, 0 rows affected (0.00 sec)
create user 'repl'@'10.20.24.89' identified by '123456'; #創建slave賬戶
grant REPLICATION SLAVE ON *.* TO 'repl'@'10.20.24.89'; #創建slave賬戶
主庫參數推薦
這些參數都是我們在各金融交易系統中經過數百家客戶運行足夠穩定、出現問題時確保能夠及時排查后提煉出的對性能、穩定性較為重要的主要參數,而不是隨機查看官方文檔或者網上復制粘貼的,並且我們會定期對其進行更新以確保最適合我們在用的mysql版本和分支。
query_cache_size = 0
query_cache_type=0
innodb_undo_tablespaces=16(需初始化mysql時命令行中先包含)
innodb_undo_directory=(專用redo磁盤文件系統路徑)
innodb_thread_concurrency=(cpu數量+物理磁盤的數量)
innodb_strict_mode=true
tmpdir=/tmp
character_set_server=gbk或者utf8mb4(絕大多數系統應默認使用gbk,對於有特殊要求的建議在字段級別設置為utf-8)
autocommit=0
innodb_buffer_pool_size=60%-75%物理內存
innodb_flush_method=O_DIRECT(如果不使用硬件RAID控制器或者使用SAN,則不要設置)
innodb_flush_log_at_trx_commit(核心交易系統設置為1,默認為1,其他2或者0)
transaction-isolation=READ-COMMITTED
innodb_autoinc_lock_mode = 2
skip-name-resolve
large-pages(測試未看出明顯受益,主要是內存沒有足夠壓力,故當前不建議設置)
back-log=500
innodb-status-file=TRUE(推薦設置)
default-storage-engine=InnoDB
memlock=true(對於專用mysql服務器,建議禁用swap,此時此參數可以不設置,在共享服務器上,如果設置了,那么在內存不夠時,可能導致Mysql因為內存不夠而無法啟動)
innodb_fast_shutdown=0
sync_binlog(核心交易系統設置為1,默認為1,其他2或者0)
log-bin=mysql-bin
binlog_format(OLTP為row,DSS系統為mixed,如不確定,請使用row)
binlog_checksum=NONE
binlog_row_image=full(mariadb沒有參數,設置了啟動會報錯)
binlog_cache_size = 8M
max_binlog_size = 500M
max_binlog_cache_size = 100M
expire_logs_days = 7
innodb_log_file_size=512m
innodb-log-buffer-size=8M
innodb-log-files-in-group=(3-5,視生成的日志量而定)
innodb_log_group_home_dir=/usr/local/mysql/redo(專用redo磁盤文件系統路徑)
innodb_flush_neighbors(默認值為1,SSD設置為0,Neighbors指的是屬於一個extent的所有頁面,一個extent共64個頁面,出於硬盤IO順序寫的考慮,InnoDB通常會刷新一個extent中的所有頁面,因為SSD在隨機IO上沒有額外負載,所以不需要啟用該特性)
innodb_page_size(SSD設置為4KB)
innodb_data_home_dir=/usr/local/mysql/data(專用data磁盤文件系統路徑)
# innodb_data_file_path=ibdata1:2000M;ibdata2:10M:autoextend (專用data磁盤文件系統路徑,存儲系統表空間,建議不要明確設置,如若不然的話,ibdata1的大小需要和實際大小相同)
innodb_change_buffer_max_size(InnoDB使用Change buffering以最小化隨機IO,一旦change buffer滿了,隨后的DMLs將直接在相應的表上進行更改,change buffer以固定的頻率(5.5不可更改,5.6由此參數控制,change buffer越接近該值,后台執行越頻繁,每次合並的量由innodb_io_capacity控制(默認為200,代表10K RPM的硬盤,對於5400或者7200 RPM的硬盤,可以設置為100,代表每次可以執行100次IOPS(測試時每次大小可配置,這里應該說的是基於16KB大小,可參考http://elf8848.iteye.com/blog/1731301)。對於RAID或者SSD,增加的話,會有所幫助,現代系統應該調整))由后台進程合並到數據頁,寫入和讀取頻率接近的系統可設置為50,默認為25,代表buffer pool大小的25%,具體請咨詢DBA)
innodb_lock_wait_timeout=86400(根據實際情況配置)
default-tmp-storage-engine=InnoDB
innodb-autoextend-increment=16M
innodb-buffer-pool-instances=min(8,nGB/1GB)
innodb-file-io-threads=max(4,nGB/4GB)
innodb_io_capacity=可供MySQL使用的IOPS(建議使用Oracle ORION進行測試)
innodb-file-per-table=true
innodb_rollback_on_timeout=true
innodb-old-blocks-time(混合型系統可以調整為60000或更高,具體請咨詢DBA)
innodb-print-all-deadlocks=true
innodb-sort-buffer-size=(此選項為創建索引使用,不需要設置)
sort-buffer-size(DSS可語句級別動態調整,比如SET STATEMENT sort_buffer_size=100000 FOR SELECT name FROM name ORDER BY name;)
join-buffer-size=(DSS可語句級別動態調整)
open-files-limit=32767
innodb_open_files=32767
tmp-table-size(DSS可語句級別動態調整)
sql-mode=STRICT_TRANS_TABLES,STRICT_ALL_TABLES,PIPES_AS_CONCAT, ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO, ANSI_QUOTES,NO_UNSIGNED_SUBTRACTION,PAD_CHAR_TO_FULL_LENGTH, NO_ZERO_DATE,NO_ZERO_IN_DATE
log-output=FILE
slow-query-log=true
log-queries-not-using-indexes=true(對於mysql而言,該參數應該設置,具體看情況,有可能很多小表很快會使得slow_query_log增長的很快)
log_slow_filter
log_slow_sp_statements
log_slow_verbosity
innodb_show_verbose_locks=1
innodb_print_lock_wait_timeout_info=ON
server-id=1
port=3306
read_rnd_buffer_size(DSS需語句級別動態調整)
thread_handling=pool-of-threads
thread_pool_max_threads=100
thread_pool_size=50
thread_cache_size=64
max-connections=3000
event_scheduler=ON
#GTID 5.6引入主要是為了解決主從模式下主節點宕機后切換主節點時確定當前的事務進度(因為不同的實例日志點位不一定相同,而GTID的格式是日志source_id+事務id,所以可以保證所有節點的邏輯事務進度一致,這使得切換的難度大大降低)。
gtid-mode = ON #(Group Replication要求必須開啟GTID,MariaDB沒有這個參數,設置后會報錯,不過默認就是啟用GTID,GTID和基於binlog的區別https://www.percona.com/sites/default/files/presentations/Failover_GTID_MySQL_56_Fosdem.pdf
https://pdfs.semanticscholar.org/presentation/3036/b68bcb8bd2f4fed590fd85607e37bf511858.pdf)
log_slave_updates=ON(GTID模式必須開始log_slave_updates,對性能有一定影響)
enforce-gtid-consistency = ON(MariaDB沒有這個參數,設置后會報錯,不過默認就是啟用GTID)
relay-log-info-repository=TABLE(MariaDB沒有這個參數,設置后會報錯,不過默認就是啟用GTID)
master-info-repository=TABLE(MariaDB沒有這個參數,設置后會報錯,不過默認就是啟用GTID)
slave_parallel_workers=4 --開啟基於庫的多線程復制默認0不開啟 (MariaDB沒有這個參數,設置后會報錯,不過默認就是啟用GTID)
innodb_lru_scan_depth(默認1024,這個參數控制page_cleaner線程掃描多少LRU列表中的臟頁,對於寫緊張的系統,降低該值,即使內存超大也一樣;如果IO容量足夠,增加該值;大型系統通常需要更改該參數)
innodb_use_global_flush_log_at_trx_commit=0
userstat=ON
thread_statistics=ON
windows下安裝可參考https://blog.csdn.net/ycxzuoxin/article/details/80908447