Mycat高可用解決方案一(mysql安裝)
Mycat關鍵特性
關鍵特性
- 支持SQL92標準
- 支持MySQL、Oracle、DB二、SQL Server、PostgreSQL等DB的常見SQL語法
- 遵照Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。
- 基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集羣。
- 支持Galera for MySQL集羣,Percona Cluster或者MariaDB cluster
- 基於Nio實現,有效管理線程,解決高併發問題。
- 支持數據的多片自動路由與聚合,支持sum,count,max等經常使用的聚合函數,支持跨庫分頁。
- 支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join。
- 支持經過全局表,ER關係的分片策略,實現了高效的多表join查詢。
- 支持多租戶方案。
- 支持分佈式事務(弱xa)。
- 支持XA分佈式事務(1.6.5)。
- 支持全局序列號,解決分佈式下的主鍵生成問題。
- 分片規則豐富,插件化開發,易於擴展。
- 強大的web,命令行監控。
- 支持前端做爲MySQL通用代理,後端JDBC方式支持Oracle、DB二、SQL Server 、 mongodb 、巨杉。
- 支持密碼加密
- 支持服務降級
- 支持IP白名單
- 支持SQL黑名單、sql注入攻擊攔截
- 支持prepare預編譯指令(1.6)
- 支持非堆內存(Direct Memory)聚合計算(1.6)
- 支持PostgreSQL的native協議(1.6)
- 支持mysql和oracle存儲過程,out參數、多結果集返回(1.6)
- 支持zookeeper協調主從切換、zk序列、配置zk化(1.6)
- 支持庫內分表(1.6)
- 集羣基於ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。
- 一個完全開源的,面向企業應用開發的大數據庫集羣
- 支持事務、ACID、能夠替代MySQL的增強版數據庫
- 一個能夠視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
- 支持對Mycat、Mysql性能監控
- 支持對Mycat的JVM內存提供監控服務
- 支持對線程的監控
- 支持對操做系統的CPU、內存、磁盤、網絡的監控
- 徹底實現分佈式事務,徹底的支持分佈式。
- 經過Mycat web(eye)完成可視化配置,及智能監控,自動運維。
- 經過mysql 本地節點,完整的解決數據擴容難度,實現自動擴容機制,解決擴容難點。
- 支持基於zookeeper的主從切換及Mycat集羣化管理。
- 經過Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集羣節點的動態上下線。
- 接入Spark等第三方工具,解決數據分析及大數據聚合的業務場景。
- 經過Mycat智能優化,分析分片熱點,提供合理的分片建議,索引建議,及數據切分實時業務建議。
什麼是MYCAT
- 一個完全開源的,面向企業應用開發的大數據庫集羣
- 支持事務、ACID、能夠替代MySQL的增強版數據庫
- 一個能夠視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
MYCAT監控
- 支持對Mycat、Mysql性能監控
- 支持對Mycat的JVM內存提供監控服務
- 支持對線程的監控
- 支持對操做系統的CPU、內存、磁盤、網絡的監控

目標
低成本的將現有的單機數據庫和應用平滑遷移到「雲」端,解決數據存儲和業務規模迅速增加狀況下的數據瓶頸問題。html
1.6版本架構

- 徹底實現分佈式事務,徹底的支持分佈式。
- 經過Mycat web(eye)完成可視化配置,及智能監控,自動運維。
- 經過mysql 本地節點,完整的解決數據擴容難度,實現自動擴容機制,解決擴容難點。
- 支持基於zookeeper的主從切換及Mycat集羣化管理。
- 經過Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集羣節點的動態上下線。
- 接入Spark等第三方工具,解決數據分析及大數據聚合的業務場景。
- 經過Mycat智能優化,分析分片熱點,提供合理的分片建議,索引建議,及數據切分實時業務建議。
優點
基於阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能以及衆多成熟的使用案例使得MYCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,咱們能看到更遠。業界優秀的開源項目和創新思路被普遍融入到MYCAT的基因中,使得MYCAT在不少方面都領先於目前其餘一些同類的開源項目,甚至超越某些商業產品。前端
MYCAT背後有一支強大的技術團隊,其參與者都是5年以上資深軟件工程師、架構師、DBA等,優秀的技術團隊保證了MYCAT的產品質量。node
MYCAT並不依託於任何一個商業公司,所以不像某些開源項目,將一些重要的特性封閉在其商業產品中,使得開源項目成了一個擺設。mysql
Mycat高可用方案



MyCAT 和 TDDL、Amoeba、Cobar 癿架構比較linux





部署環境
系統版本:git
操做系統:CentOS-6.4 操做用戶:root/hadoop 系統 IP:192.168.199.101 主機名:mysql-01 配置:4 核、2G 內存
軟件版本:github
MySQL 版本:mysql-5.7.9 JDK版本:jdk1.7 HAProxy版本:haproxy-1.5.19.tar.gz mycat版本:1.6.5 keepalived版本:
1、服務器配置:
一、配置網絡
# vi /etc/sysconfig/network-scripts/ifcfg-eth0web
DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static #HWADDR=00:50:56:a1:12:53 IPADDR=192.168.199.101 GATEWAY=192.168.199.2 NETMASK=255.255.255.0 DNS1=8.8.8.8 DNS2=192.168.199.2
二、設置主機名
# vi /etc/sysconfig/network算法
NETWORKING=yes HOSTNAME=mysql-01
三、設置 IP 與主機名的映射,sql
若是服務器啓動但您沒法鏈接到它,請確保您有一個條目/etc/hosts
,以下所示:
# vi /etc/hosts
127.0.0.1 mysql-01
192.168.199.101 mysql-01127.0.0.1 localhost
四、兩臺數據庫服務器的的 selinux 都要 disable
(永久關閉 selinux,請修改/etc/selinux/config,將 SELINUX 改成 disabled)
# vi /etc/selinux/config
五、重啓操做系統
# reboot
======================================
2、mysql安裝 MySQL5.7:
一、使用下面的命令檢查是否安裝有 MySQL Server:
# rpm -qa | grep mysql
mysql-libs-5.1.73-3.el6_5.x86_64
若是是 CentOS7 以上,請使用如下命令查看:
# rpm -qa | grep mariadb
mariadb-libs-5.5.41-2.el7_0.x86_64
(由於沒有 MySQL 服務,所以不必卸載。mysql-libs 是 MySQL 的必要包)
(若是有的話可經過下面的命令來卸載掉,rpm -e mysql --nodeps //普通刪除模)
二、改防火牆設置,打開 3306 端口:
# vi /etc/sysconfig/iptables
增長以下行:
# MySQL
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
或者關閉防火牆:
(1)即時生效,重啓後失效
開啓: service iptables start
關閉: service iptables stop 或者systemctl stop firewalld.service
(2)重啓後生效
開啓: chkconfig iptables on
關閉: chkconfig iptables off
重啓防火牆:
# service iptables restart
三、新增 mysql 用戶組:
# groupadd mysql
四、新增 mysql 用戶,並添加到 mysql 用戶組:
# useradd -r -g mysql mysql
五、新建 MySQL 執行文件目錄(後面會把編譯好的 mysql 程序安裝到這個目錄):
# mkdir -p /usr/local/mysql
(-p 參數的做用是:若是最終目錄的父目錄不存在也會一併建立,編譯安裝方式才須要手動建立,非編譯方式省略此步驟)
六、新建 MySQL 數據庫數據文件目錄:
# mkdir -p /home/mysql/data
# mkdir -p /home/mysql/logs
# mkdir -p /home/mysql/temp
(注意:上面的 logs 及 temp 目錄是爲了之後將 MySQL 的數據文件與執行程序文件分離,
若是你打算設置到不一樣的路徑,注意修改對應的執行命令和數據庫初始化腳本。正式生產環
境,建議數據目錄和日誌目錄都使用單獨的分區來掛載,不一樣分區屬於不一樣的磁盤或磁盤組。)
七、下載mysql免編譯安裝包:
wget https://downloads.mysql.com/archives/get/file/mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz
八、解壓:
tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
文件夾重命名:
# cd /usr/local/
# mv mysql-5.7.9-linux-glibc2.5-x86_64/ mysql/
九、增長 PATH 環境變量搜索路徑:
# vi /etc/profile
##在 profile 文件末尾增長兩行
# mysql env param
PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
使 PATH 搜索路徑當即生效:
# source /etc/profile
十、修改 mysql 目錄擁有者爲 mysql 用戶:
# chown -Rf mysql:mysql /usr/local/mysql # chown -Rf mysql:mysql /home/mysql
十一、進入 mysql 執行程序的安裝路徑:
# cd /usr/local/mysql
執行初始化配置腳本,建立系統自帶的數據庫和表(注意:路徑/home/mysql/data 須要換成你自定定義的數據庫存放路徑):
數據初始化變動:
mysq5.7以前:
# scripts/mysql_install_db --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/home/mysql/data
mysq5.7以後:
bin/mysqld --initialize --user=mysql \ --basedir=/usr/local/mysql \
--datadir=/home/mysql/data
記錄登陸初始化密碼: root@localhost: zB<3Ek+e7FU0
十二、拷貝配置文件到 /etc目錄下:
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
初始化腳本在/usr/local/mysql/下生成了配置文件 my.cnf,須要更改該配置文件的全部者:
# ls -lah
chown -Rf mysql:mysql /etc/my.cnf
注意:
(1)在啓動 MySQL 服務時,會按照必定次序搜索 my.cnf,先在/etc 目錄下找,找不到則會搜索 mysql 程序目錄下是否有 my.cnf
(2)須要注意 CentOS 6 版操做系統的最小安裝完成後,即便沒有安裝 mysql,在/etc 目錄下也會存在一個 my.cnf 文件,建議將此文件改名爲其餘的名字。
不然該文件會干擾源碼安裝的 MySQL 的正確配置,形成沒法啓動。修改/etc/my.cnf 操做以下:
能夠:mv /etc/my.cnf /etc/my.cnf.bak
也能夠:刪除掉/etc/my.cnf 這個文件:rm /etc/my.cnf
若是你須要用於生產環境,不要急着作下面的 mysql 啓動操做。建議把上一步驟中 mysql初始化生成的/usr/local/mysql/my.cnf 刪除,而後把你優化好的 mysql 配置文件 my.cnf 放到/etc下。(咱們這裏使用/etc/my.cnf)
1三、編輯/etc/my.cnf: # vi /etc/my.cnf
#######################################################################
# 詳細參數參考地址:
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
#
#######################################################################
[client]
port = 3306
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysqld]
######################################################################
# basic settings 基本設置
# 一、lower_case_table_names:庫名、表名是否區分大小寫。
# 默認爲0,設置1,不區分大小寫,建立的表、數據庫都以小寫形式存放磁盤。
,找回密碼時有用
######################################################################
bind-address = 0.0.0.0
port = 3306
lower_case_table_names=1
#skip-grant-tables
#skip-networking
explicit_defaults_for_timestamp=1
table_open_cache = 8000
######################################################################
# character set 編碼
######################################################################
character-set-server = utf8mb4
collation-server = utf8mb4_bin
######################################################################
# dir 數據目錄
# 有條件的狀況下,目錄分別掛載到不一樣的磁盤目錄,提升磁盤io對數據庫性能影響。
######################################################################
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
######################################################################
# time out 超時時間
######################################################################
connect_timeout = 20
wait_timeout=86400
######################################################################
# connection 最大鏈接個數
######################################################################
max_connections = 500
max_user_connections = 1000
max_connect_errors = 100000
max_allowed_packet = 32M
######################################################################
# innodb 存儲引擎
# innodb_buffer_pool_size 通常配置爲物理內存的1/2 或2/3
######################################################################
default-storage-engine = INNODB
innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 64
######################################################################
#slow query 慢查詢日誌
#
######################################################################
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log
long_query_time= 2
log_queries_not_using_indexes = on
######################################################################
# log-bin 二進制日誌:
# 一、開啓log-bin 必須配置server-id
# 二、binlog_ignore_dbL:log-bin 忽略的表
# 三、binlog_format取值:
# STATEMENT:致使日誌記錄基於語句。
# ROW:致使日誌記錄基於行。
# MIXED:致使日誌記錄使用混合格式。
######################################################################
server-id=100
log_bin=mysql-bin
binlog_format = MIXED
sync_binlog = 1
expire_logs_days =7
binlog_cache_size = 128m
max_binlog_cache_size =512m
max_binlog_size =256M
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
######################################################################
# relay-log 中繼日誌
#
######################################################################
relay_log = mysql-relay-bin
relay_log_purge = on
relay_log_recovery = on
max_relay_log_size = 512M
######################################################################
# cache 緩存
#
######################################################################
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
tmp_table_size = 256M
max_heap_table_size = 256M
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
skip_name_resolve=ON
back_log=600
sort_buffer_size=4M
join_buffer_size = 4M
thread_cache_size = 300
######################################################################
# sql mode 在MySQL 5.7的默認SQL模式包括如下模式:
# ONLY_FULL_GROUP_BY,
# STRICT_TRANS_TABLES,
# NO_ZERO_IN_DATE,
# NO_ZERO_DATE,
# ERROR_FOR_DIVISION_BY_ZERO,
# NO_AUTO_CREATE_USER,
# NO_ENGINE_SUBSTITUTION。
######################################################################
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 32M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 二、skip-grant-table:跳過數據庫權限驗證
1四、複製服務啓動腳本:
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
賦予可執行權限
chmod 755 /etc/init.d/mysql
或者
chmod +x /etc/init.d/mysql
3、添加服務
chkconfig --add mysql
4、顯示服務列表
chkconfig --list
或者
chkconfig --list | grep -i mysql
驗證
netstat -na | grep 3306
或者
netstat -apn | grep 3306
1五、啓動 MySQL 服務:
Starting MySQL.. SUCCESS!
(初次啓動會在/usr/local/mysql 目錄下生成 mysql.sock 文件)
修改密碼:

1六、設置 MySQL 開機自動啓動服務:
# chkconfig mysql on
存在的問題:
一、mysql 免密碼登陸直接mysql不行能夠加上 -h 127.0.0.1 試一試。

2 、初始密碼忘記的狀況(打開skip-grant-tables配置)。
設置 MySQL 數據庫 root 用戶的本地登陸密碼(初始用戶沒有密碼):
# mysqladmin -u root password '123456'
[mysqld] skip-grant-tables=1
登陸並修改 MySQL 用戶 root 的密碼:mysql -h 127.0.0.1
修改 root 用戶密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; 容許 root 遠程登陸,設置遠程登陸密碼:123456
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
下面是具體步驟:
[root@mysql-01 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.9
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases; +--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.42 sec)
mysql> select host, user, authentication_string, plugin from mysql.user; +-----------+-----------+-------------------------------------------+-----------------------+
| host | user | authentication_string | plugin |
+-----------+-----------+-------------------------------------------+-----------------------+
| localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | mysql_native_password |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
+-----------+-----------+-------------------------------------------+-----------------------+
2 rows in set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select host, user, authentication_string, plugin from mysql.user; +-----------+-----------+-------------------------------------------+-----------------------+
| host | user | authentication_string | plugin |
+-----------+-----------+-------------------------------------------+-----------------------+
| localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | mysql_native_password |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| % | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | mysql_native_password |
+-----------+-----------+-------------------------------------------+-----------------------+
3 rows in set (0.00 sec)
mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
[root@mysql-01 ~]#
新密碼登陸測試: mysql -uroot -p123456

注意:真實生產環境,應用操做不要使用 root 用戶。
bind-address:MySQL服務器在單個網絡套接字上偵聽TCP/IP鏈接。此套接字綁定到單個地址,但地址能夠映射到多個網絡接口。
要指定地址,請使用 服務器啓動時的 選項,其中包含IPv4或IPv6地址或主機名。若是是主機名,則服務器將名稱解析爲IP地址並綁定到該地址。
若是主機名解析爲多個IP地址,則服務器將使用第一個IPv4地址(若是有),不然使用第一個IPv6地址。
服務器處理不一樣類型的地址,以下所示:
(1)若是地址是*,則服務器接受全部服務器主機IPv4接口上的TCP/IP鏈接,若是服務器主機支持IPv6,則接受全部IPv6接口上的TCP/IP鏈接。
使用此地址容許全部服務器接口上的IPv4和IPv6鏈接。該值是默認值。
(2)若是地址是0.0.0.0,則服務器接受全部服務器主機IPv4接口上的TCP/IP鏈接。
(3)若是地址是::,則服務器接受全部服務器主機IPv4和IPv6接口上的TCP/IP鏈接。
(4)若是地址是IPv4映射地址,則服務器接受IPv4或IPv6格式的該地址的TCP/IP鏈接。
例如,若是綁定了服務器::ffff:127.0.0.1,則客戶端可使用--host=127.0.0.1或 鏈接--host=::ffff:127.0.0.1。
若是地址是「常規」 IPv4或IPv6地址(例如127.0.0.1或 ::1),則服務器僅接受該IPv4或IPv6地址的TCP/IP鏈接。
若是綁定到地址失敗,服務器將產生錯誤而且不會啓動。
若是要將服務器綁定到特定地址,請確保mysql.user系統表包含具備管理權限的賬戶,可用於鏈接到該地址。不然,您將沒法關閉服務器。
例如,若是將服務器綁定到*,則可使用全部現有賬戶鏈接到該服務器。可是若是綁定服務器 ::1,它只接受該地址上的鏈接。
在這種狀況下,首先要確保 'root'@'::1'該mysql.user表存在於mysql.user表中,這樣您仍然能夠鏈接到服務器以將其關閉。
二進制文件參數:
log-bin:
該值將用做日誌文件的名稱。服務器經過向該名稱添加數字後綴來按順序建立二進制日誌文件。在MySQL 5.7中,基本名稱默認host_name
-bin
使用主機名稱。建議您指定基本名稱,以便不管默認名稱如何更改,均可以繼續使用相同的二進制日誌文件名。
二進制日誌文件的默認位置是數據目錄。您可使用該--log-bin
選項指定備用位置,方法是在基本名稱中添加前導絕對路徑名以指定其餘目錄。當服務器從二進制日誌索引文件中讀取條目時,該文件跟蹤已使用的二進制日誌文件,它會檢查條目是否包含相對路徑。
設置此選項會致使 log_bin
系統變量設置爲ON
(或1
),而不是基本名稱。二進制日誌文件基本名稱和任何指定的路徑均可用做 log_bin_basename
系統變量。
若是指定 log-bin
選項而不指定a server-id
,則不容許啓動服務器。
binlog_format:指定二進制日誌的格式:
STATEMENT:致使日誌記錄基於語句。
ROW:致使日誌記錄基於行。
MIXED:致使日誌記錄使用混合格式。
SET GLOBAL binlog_format = 'ROW';
SET SESSION binlog_format = 'ROW';
當存在任何臨時表時,不建議在運行時切換複製格式,由於臨時表僅在使用基於語句的複製時記錄,而基於行的複製則不記錄臨時表。經過混合複製,一般會記錄臨時表; 用戶定義函數(UDF)和函數發生異常 UUID()。
示例:
binlog-format={ROW|STATEMENT|MIXED}
relay-log:用於中繼日誌的位置和基本名稱
示例:
relay_log=mysql-relay-bin
max_relay_log_size:若是非零,則當其大小超過此值時,會自動輪換中繼日誌。
若是爲零,則發生旋轉的大小由max_binlog_size的值肯定。
示例:
max_relay_log_size = 512M
relay_log_recovery:是否啓用了在啓動時從主服務器自動恢復中繼日誌文件; 必須啓用崩潰安全從站
示例:
relay_log_recovery = on
relay_log_purge:肯定是否清除中繼日誌
示例:
relay_log_purge = on
slave-max-allowed-packet:能夠從複製主服務器發送到從服務器的數據包的最大大小(以字節爲單位); 覆蓋max_allowed_packet
鏈接相關參數
max_connections:容許客戶端併發鏈接的最大數量,默認值是151,通常將該參數設置爲500-2000
max_connect_errors:若是客戶端嘗試鏈接的錯誤數量超過這個參數設置的值,則服務器再也不接受新的客戶端鏈接。能夠經過清空主機的緩存來解除服務器的這種阻止新鏈接的狀態,經過FLUSH HOSTS或mysqladmin flush-hosts命令來清空緩存。這個參數的默認值是100,通常將該參數設置爲100000。
interactive_timeout:Mysql關閉交互鏈接前的等待時間,單位是秒,默認是8小時,建議不要將該參數設置超過24小時,即86400
wait_timeout:Mysql關閉非交互鏈接前的等待時間,單位是秒,默認是8小時,建議不要將該參數設置超過24小時,即86400
skip_name_resolve:若是這個參數設爲OFF,則MySQL服務在檢查客戶端鏈接的時候會解析主機名;若是這個參數設爲ON,則MySQL服務只會使用IP,在這種狀況下,受權表中的Host字段必須是IP地址或localhost。
這個參數默認是關閉的
back_log:MySQL服務器鏈接請求隊列所能處理的最大鏈接請求數,若是隊列放滿了,後續的鏈接纔會拒絕。當主要的MySQL線程在很短期內獲取大量鏈接請求時,這個參數會生效。接下來,MySQL主線程會花費很短的時間去檢查鏈接,而後開啓新的線程。這個參數指定了MySQL的TCP/IP監聽隊列的大小。若是MySQL服務器在短期內有大量的鏈接,能夠增長這個參數。
文件相關參數sync_binlog:控制二進制日誌被同步到磁盤前二進制日誌提交組的數量。當這個參數爲0的時候,二進制日誌不會被同步到磁盤;當這個參數設爲0以上的數值時,就會有設置該數值的二進制提交組按期同步日誌到磁盤。當這個參數設爲1的時候,全部事務在提交前會被同步到二進制日誌中,於是即便MySQL服務器發生意外重啓,任何二進制日誌中沒有的事務只會處於準備狀態,這會致使MySQL服務器自動恢復以回滾這些事務。這樣就會保證二進制日誌不會丟失事務,是最安全的選項;同時因爲增長了磁盤寫,這對性能有必定下降。將這個參數設爲1以上的數值會提升數據庫的性能,但同時會伴隨數據丟失的風險。建議將該參數設爲二、四、六、八、16。
expire_logs_days:二進制日誌自動刪掉的時間間隔。默認值爲0,表明不會自動刪除二進制日誌。想手動刪除二進制日誌,能夠執行 PURGE BINARY LOGS。
示例:
expire_logs_days =7
max_binlog_size:二進制日誌文件的最大容量,當寫入的二進制日誌超過這個值的時候,會完成當前二進制的寫入,向新的二進制日誌寫入日誌。這個參數最小值時4096字節;最大值和默認值時1GB。相同事務中的語句都會寫入同一個二進制日誌,當一個事務很大時,二進制日誌實際的大小會超過max_binlog_size參數設置的值。若是max_relay_log_size參數設爲0,則max_relay_log_size參數會使用和max_binlog_size參數一樣的大小。建議將此參數設爲512M。
local_infile:是否容許客戶端使用LOAD DATA INFILE語句。若是這個參數沒有開啓,客戶端不能在LOAD DATA語句中使用LOCAL參數。
open_files_limit:操做系統容許MySQL服務打開的文件數量。這個參數實際的值以系統啓動時設定的值、max_connections和table_open_cache爲基礎,使用下列的規則:
- 10 + max_connections + (table_open_cache * 2)
- max_connections * 5
- MySQL啓動時指定open_files_limit的值
緩存控制參數binlog_cache_size:在事務中二進制日誌使用的緩存大小。若是MySQL服務器支持全部的存儲引擎且啓用二進制日誌,每一個客戶端都會被分配一個二進制日誌緩存。若是數據庫中有不少大的事務,增大這個緩存能夠得到更好的性能。
Binlog_cache_use和Binlog_cache_disk_use這兩個參數對於binlog_cache_size參數的優化頗有用。binlog_cache_size參數只設置事務所使用的緩存,非事務SQL語句所使用的緩存由binlog_stmt_cache_size系統參數控制。建議不要將這個參數設爲超過64MB,以防止客戶端鏈接多而影響MySQL服務的性能。
max_binlog_cache_size:若是一個事務須要的內存超過這個參數,服務器會報錯"Multi-statement transaction required more than 'max_binlog_cache_size' bytes"。這個參數最大的推薦值是4GB,這是由於MySQL不能在二進制日誌設爲超過4GB的狀況下正常的工做。建議將該參數設爲binlog_cache_size*2。
binlog_stmt_cache_size:這個參數決定二進制日誌處理非事務性語句的緩存。若是MySQL服務支持任何事務性的存儲引擎且開啓了二進制日誌,每一個客戶端鏈接都會被分配二進制日誌事務和語句緩存。若是數據庫中常常運行大的事務,增長這個緩存能夠得到更好的性能。
table_open_cache:全部線程能打開的表的數量。
thread_cache_size:MySQL服務緩存以重用的線程數。當客戶端斷開鏈接的時候,若是線程緩存沒有使用滿,則客戶端的線程被放入緩存中。若是有客戶端斷開鏈接後再次鏈接到MySQL服務且線程在緩存中,則MySQL服務會優先使用緩存中的線程;若是線程緩存沒有這些線程,則MySQL服務器會建立新的線程。若是數據庫有不少的新鏈接,能夠增長這個參數來提高性能。若是MySQL服務器每秒有上百個鏈接,能夠增大thread_cache_size參數來使MySQL服務器使用緩存的線程。經過檢查Connections和Threads_created狀態參數,能夠判斷線程緩存是否足夠。這個參數默認的值是由下面的公式來決定的:8 + (max_connections / 100)
建議將此參數設置爲300~500。線程緩存的命中率計算公式爲(1-thread_created/connections)*100%,能夠經過這個公式來優化和調整thread_cache_size參數。
query_cache_size:爲查詢結果所分配的緩存。默認這個參數是沒有開啓的。這個參數的值應設爲整數的1024倍,若是設爲其餘值則會被自動調整爲接近此數值的1024倍。這個參數最小須要40KB。建議不要將此參數設爲大於256MB,以避免佔用太多的系統內存。
query_cache_min_res_unit:查詢緩存所分配的最小塊的大小。默認值是4096(4KB)。
query_cache_type:設置查詢緩存的類型。當這個參數爲0或OFF時,則MySQL服務器不會啓用查詢緩存;當這個參數爲1或ON時,則MySQL服務器會緩存全部查詢結果(除了帶有SELECT SQL_NO_CACHE的語句);當這個參數爲2或DEMAND時,則MySQL服務器只會緩存帶有SELECT SQL_CACHE的語句。
sort_buffer_size:每一個會話執行排序操做所分配的內存大小。想要增大max_sort_length參數,須要增大sort_buffer_size參數。若是在SHOW GLOBAL STATUS輸出結果中看到每秒輸出的Sort_merge_passes狀態參數很大,能夠考慮增大sort_buffer_size這個值來提升ORDER BY 和 GROUP BY的處理速度。建議設置爲1~4MB。當個別會話須要執行大的排序操做時,在會話級別增大這個參數。
read_buffer_size:爲每一個線程對MyISAm表執行順序讀所分配的內存。若是數據庫有不少順序讀,能夠增長這個參數,默認值是131072字節。這個參數的值須要是4KB的整數倍。這個參數也用在下面場景中:
- 當執行ORDER BY操做時,緩存索引到臨時文件(不是臨時表)中;
- 執行批量插入到分區表中;
- 緩存嵌套查詢的執行結果。
read_rnd_buffer_size:這個參數用在MyISAM表和任何存儲引擎表隨機讀所使用的內存。當從MyISAM表中以鍵排序讀取數據的時候,掃描的行將使用這個緩存以免磁盤的掃描。將這個值設到一個較大的值能夠顯著提高ORDER BY的性能。而後,這個參數會應用到全部的客戶端鏈接,全部不該該將這個參數在全局級別設爲一個較大的值;在運行大查詢的會話中,在會話級別增大這個參數便可。
join_buffer_size:MySQL服務器用來做普通索引掃描、範圍索引掃描和不使用索引而執行全表掃描這些操做所用的緩存大小。一般,獲取最快鏈接的方法是增長索引。當不能增長索引的時候,使全鏈接變快的方法是增大join_buffer_size參數。對於執行全鏈接的兩張表,每張表都被分配一塊鏈接內存。對於沒有使用索引的多表複雜鏈接,須要多塊鏈接內存。一般來講,能夠將此參數在全局上設置一個較小的值,而在須要執行大鏈接的會話中在會話級別進行設置。默認值是256KB。
net_buffer_length:每一個客戶端線程和鏈接緩存和結果緩存交互,每一個緩存最初都被分配大小爲net_buffer_length的容量,並動態增加,直至達到max_allowed_packet參數的大小。當每條SQL語句執行完畢後,結果緩存會縮小到net_buffer_length大小。不建議更改這個參數,除非你的系統有不多的內存,能夠調整這個參數。若是語句須要的內存超過了這個參數的大小,則鏈接緩存會自動增大。net_buffer_length參數最大能夠設置到1MB。不能在會話級別設置這個參數。
max_allowed_packet:網絡傳輸時單個數據包的大小。默認值是4MB。包信息緩存的初始值是由net_buffer_length指定的,可是包可能會增加到max_allowed_packet參數設置的值。若是要使用BLOB字段或長字符串,須要增長這個參數的值。這個參數的值須要設置成和最大的BLOB字段同樣的大小。max_allowed_packet參數的協議限制是1GB。這個參數應該是1024整數倍。
bulk_insert_buffer_size:MyISAM表使用一種特殊的樹狀緩存來提升批量插入的速度,如INSERT ... SELECT,INSERT ... VALUES (...),(...), ...,對空表執行執行LOAD DATA INFILE。這個參數每一個線程的樹狀緩存大小。將這個參數設爲0會關閉這個參數。這個參數的默認值是8MB。
max_heap_table_size:這個參數設置用戶建立的MEMORY表容許增加的最大容量,這個參數用來MEMORY表的MAX_ROWS值。設置這個參數對已有的MEMORY表沒有影響,除非表重建或執行ALTER TABLE、TRUNCATE TABLE語句。
這個參數也和tmp_table_size參數一塊兒來如今內部in-memory表的大小。若是內存表使用頻繁,能夠增大這個參數的值。
tmp_table_size:內部內存臨時表的最大內存。這個參數不會應用到用戶建立的MEMORY表。若是內存臨時表的大小超過了這個參數的值,則MySQL會自動將超出的部分轉化爲磁盤上的臨時表。在MySQL 5.7.5版本,internal_tmp_disk_storage_engine存儲引擎將做爲磁盤臨時表的默認引擎。在MySQL 5.7.5以前的版本,會使用MyISAM存儲引擎。若是有不少的GROUP BY查詢且系統內存充裕,能夠考慮增大這個參數。
innodb_buffer_pool_dump_at_shutdown:指定在MySQL服務關閉時,是否記錄InnoDB緩存池中的緩存頁,以縮短下次重啓時的預熱過程。一般和innodb_buffer_pool_load_at_startup參數搭配使用。innodb_buffer_pool_dump_pct參數定義了保留的最近使用緩存頁的百分比。
innodb_buffer_pool_dump_now:馬上記錄InnoDB緩衝池中的緩存頁。一般和innodb_buffer_pool_load_now搭配使用。
innodb_buffer_pool_load_at_startup:指定MySQL服務在啓動時,InnoDB緩衝池經過加載以前的緩存頁數據來自動預熱。一般和innodb_buffer_pool_dump_at_shutdown參數搭配使用。
innodb_buffer_pool_load_now:馬上經過加載數據頁來預熱InnoDB緩衝池,無需重啓數據庫服務。能夠用來在性能測試時,將緩存改爲到一個已知的狀態;或在數據庫運行報表查詢或維護後,將數據庫改爲到一個正常的狀態。
MyISAM參數key_buffer_size:全部線程所共有的MyISAM表索引緩存,這塊緩存被索引塊使用。增大這個參數能夠增長索引的讀寫性能,在主要使用MyISAM存儲引擎的系統中,可設置這個參數爲機器總內存的25%。若是將這個參數設置很大,好比設爲機器總內存的50%以上,機器會開始page且變得異常緩慢。能夠經過SHOW STATUS 語句查看 Key_read_requests,Key_reads,Key_write_requests, and Key_writes這些狀態值。正常狀況下Key_reads/Key_read_requests 比率應該小於0.01。數據庫更新和刪除操做頻繁的時候,Key_writes/Key_write_requests 比率應該接近1。
key_cache_block_size:key緩存的塊大小,默認值是1024字節。
myisam_sort_buffer_size:在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操做中,MyISAM索引排序使用的緩存大小。
myisam_max_sort_file_size:當重建MyISAM索引的時候,例如執行REPAIR TABLE、 ALTER TABLE、 或 LOAD DATA INFILE命令,MySQL容許使用的臨時文件的最大容量。若是MyISAM索引文件超過了這個值且磁盤還有充裕的空間,增大這個參數有助於提升性能。
myisam_repair_threads:若是這個參數的值大於1,則MyISAM表在執行Repair操做的排序過程當中,在建立索引的時候會啓用並行,默認值爲1。
InnoDB參數innodb_buffer_pool_size:InnDB存儲引擎緩存表和索引數據所使用的內存大小。默認值是128MB。在以InnDB存儲引擎爲主的系統中,能夠將這個參數設爲機器物理內存的80%。同時須要注意:
- 設置較大物理內存時是否會引擎頁的交換而致使性能降低;
- InnoDB存儲引擎會爲緩存和控制表結構信息使用部份內存,於是實際花費的內存會比設置的值大於10%;
- 這個參數設置的越大,初始化內存池的時間越長。在MySQL 5.7.5版本,能夠以chunk爲單位增長或減小內存池的大小。chunk的大小能夠經過innodb_buffer_pool_chunk_size參數設定,默認值是128MB。內存池的大小能夠等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的整數倍。
innodb_buffer_pool_instances:InnoDB緩存池被分紅的區域數。對於1GB以上大的InnoDB緩存,將緩存分紅多個部分能夠提升MySQL服務的併發性,減小不一樣線程讀緩存頁的讀寫競爭。每一個緩存池有它單獨的空閒列表、刷新列表、LRU列表和其餘鏈接到內存池的數據結構,它們被mutex鎖保護。這個參數只有將innodb_buffer_pool_size參數設爲1GB或以上時才生效。建議將每一個分紅的內存區域設爲1GB大小。
innodb_max_dirty_pages_pct:當Innodb緩存池中髒頁所佔的百分比達到這個參數的值時,InnoDB會從緩存中向磁盤寫入數據。默認值是75。
innodb_thread_concurrency:InnoDB存儲引擎能夠併發使用的最大線程數。當InnoDB使用的線程超過這參數的值時,後面的線程會進入等待狀態,以先進先出的算法來處理。等待鎖的線程不計入這個參數的值。這個參數的範圍是0~1000。默認值是0。當這個參數爲0時,表明InnoDB線程的併發數沒有限制,這樣會致使MySQL建立它所須要的儘量多的線程。設置這個參數能夠參考下面規則:
- 若是用戶線程的併發數小於64,能夠將這個參數設爲0;
- 若是系統併發很嚴重,能夠先將這個參數設爲128,而後再逐漸將這個參數減少到96, 80, 64或其餘數值,直到找到性能較好的一個數值。
innodb_flush_method:指定刷新數據到InnoDB數據文件和日誌文件的方法,刷新方法會對I/O有影響。若是這個參數的值爲空,在類Unix系統上,這個參數的默認值爲fsync;在Windows系統上,這個參數的默認值爲async_unbuffered。在類Unix系統上,這個參數可設置的值以下:
- fsync:InnoDB使用fsync()系統函數來刷新數據和日誌文件,fsync是默認參數。
- O_DSYNC:InnoDB使用O_SYNC函數來打開和刷新日誌文件,使用fsync()函數刷新數據文件
- littlesync:這個選項用在內部性能的測試,目前MySQL尚不支持,使用這個參數又必定的風險
- nosync:這個選項用在內部性能的測試,目前MySQL尚不支持,使用這個參數又必定的風險
- O_DIRECT:InnoDB使用O_DIRECT(或者directio()在Solaris)函數打開數據文件,使用fsync()刷新數據文件和日誌文件
- O_DIRECT_NO_FSYNC:在刷新I/O時,InnoDB使用O_DIRECT方式。
在有RAID卡和寫緩存的系統中,O_DIRECT有助於避免InnoDB緩存池和操做系統緩存之間的雙重緩存。在InnoDB數據和日誌文件放在SAN存儲上面的系統,默認值或O_DSYNC方法會對以讀爲主的數據庫起到加速做用。
innodb_data_home_dir:InnoDB系統表空間所使用的數據文件的物理路徑,默認路徑是MySQL數據文件路徑。若是這個參數的值爲空,能夠在innodb_data_file_path參數裏使用絕對路徑
innodb_data_file_path:InnoDB數據文件的路徑和大小。
innodb_file_per_table:當這個參數啓用的時候,InnoDB會將新建表的數據和索引單獨存放在.ibd格式的文件中,而不是存放在系統表空間中。當這張表被刪除或TRUNCATE時,InnoDB表所佔用的存儲會被釋放。這個設定會開啓InnoDB的一些其餘特性,好比表的壓縮。當這個參數關閉的時候,InnoDB會將表和索引的數據存放到系統表空間的ibdata文件中,這會有一個問題,由於系統表空間不會縮小,這樣設置會致使空間沒法回放。
innodb_undo_directory:InnoDB undo日誌所在表空間的物理路徑。和innodb_undo_logs、innodb_undo_tablespaces參數配合,來設置undo日誌的路徑,默認路徑是數據文件路徑。
innodb_undo_logs:指定InnoDB使用的undo日誌的個數。在MySQL 5.7.2版本,32個undo日誌被臨時表預留使用,而且這些日誌存放在臨時表表空間(ibtmp1)中。若是undo日誌只存放在系統表空間中,想要額外分配供數據修改事務用的undo日誌,innodb_undo_logs參數必須設置爲32以上的整數。若是你配置了單獨的undo表空間,要將innodb_undo_logs參數設爲33以上來分配額外供數據修改事務使用的undo日誌。每一個undo日誌最多能夠支持1024個事務。若是這個參數沒有設置,則它會設爲默認值128。
innodb_undo_tablespaces:undo日誌的表空間文件數量。默認,全部的undo日誌都是系統表空間的一部分。由於在運行大的事務時,undo日誌會增大,將undo日誌設置在多個表空間中能夠減小一個表空間的大小。undo表空間文件建立在innodb_undo_directory參數指定的路徑下,以undoN格式命名,N是以0開頭的一系列整數。undo表空間的默認大小爲10M。須要在初始化InnoDB前設置innodb_undo_tablespaces這個參數。在MySQL 5.7.2版本,在128個undo日誌中,有32個undo日誌是爲臨時表所預留的,有95個undo日誌供undo表空間使用。
innodb_log_files_in_group:InnoDB日誌組包含的日誌個數。InnoDB以循環的方式寫入日誌。這個參數的默認值和推薦值均是2。日誌的路徑由innodb_log_group_home_dir參數設定。
innodb_log_group_home_dir:InnoDB重作日誌文件的物理路徑,重作日誌的數量由innodb_log_files_in_group參數指定。若是不指定任何InnoDB日誌參數,MySQL默認會在MySQL數據文件路徑下面建立兩個名爲ib_logfile0、ib_logfile1的兩個重作日誌文件,它們的大小由innodb_log_file_size參數設定。
innodb_log_file_size:日誌組中每一個日誌文件的字節大小。全部日誌文件的大小(innodb_log_file_size * innodb_log_files_in_group)不能超過512GB。
innodb_log_buffer_size:InnoDB寫入磁盤日誌文件所使用的緩存字節大小。若是innodb_page_size參數爲32K,則默認值是8MB;若是innodb_page_size參數爲64K,則默認值是16MB。若是日誌的緩存設置較大,則MySQL在處理大事務時,在提交事務前無需向磁盤寫入日誌文件。建議設置此參數爲4~8MB。
innodb_flush_log_at_trx_commit:當提交相關的I/O操做被批量從新排列時,這個參數控制提交操做的ACID一致性和高性能之間的平衡。能夠改變這個參數的默認值來提高數據庫的性能,可是在數據庫宕機的時候會丟失少許的事務。這個參數的默認值爲1,表明數據庫遵守完整的ACID模型,每當事務提交時,InnoDB日誌緩存中的內容均會被刷新到日誌文件,並寫入到磁盤。當這個參數爲0時,InnDB日誌緩存大概每秒刷新一第二天志文件到磁盤。當事務提交時,日誌緩存不會馬上寫入日誌文件,這樣的機制不會100%保證每秒都向日誌文件刷新日誌,當mysqld進程宕掉的時候可能會丟失持續時間爲1秒左右的事務數據。當這個參數爲2時,當事務提交後,InnoDB日誌緩存中的內容會寫入到日誌文件且日誌文件,日誌文件以大概每秒一次的頻率刷新到磁盤。在MySQL 5.6.6版本,InnoDB日誌刷新頻率由innodb_flush_log_at_timeout參數決定。一般將個參數設爲1。
innodb_flush_log_at_timeout:寫入或刷新日誌的時間間隔。這個參數是在MySQL 5.6.6版本引入的。在MySQL 5.6.6版本以前,刷新的頻率是每秒刷新一次。innodb_flush_log_at_timeout參數的默認值也是1秒刷新一次。
innodb_lock_wait_timeout:InnDB事務等待行鎖的時間長度。默認值是50秒。當一個事務鎖定了一行,這時另一個事務想訪問並修改這一行,當等待時間達到innodb_lock_wait_timeout參數設置的值時,MySQL會報錯"ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction",同時會回滾語句(不是回滾整個事務)。若是想回滾整個事務,須要使用--innodb_rollback_on_timeout參數啓動MySQL。在高交互性的應用系統或OLTP系統上,能夠減少這個參數來快速顯示用戶的反饋或把更新放入隊列稍後處理。在數據倉庫中,爲了更好的處理運行時間長的操做,能夠增大這個參數。這個參數只應用在InnoDB行鎖上,這個參數對錶級鎖無效。這個參數不適用於死鎖,由於發生死鎖時,InnoDB會馬上檢測到死鎖並將發生死鎖的一個事務回退。
innodb_fast_shutdown:InnoDB關庫模式。若是這個參數爲0,InnoDB會作一個緩慢關機,在關機前會作完整的刷新操做,這個級別的關庫操做會持續數分鐘,當緩存中的數據量很大時,甚至會持續幾個小時;若是數據庫要執行版本升級或降級,須要執行這個級別的關庫操做,以保證全部的數據變動都寫入到數據文件。若是這個參數的值是1(默認值),爲了節省關庫時間,InnoDB會跳過新操做,而是在下一次開機的時候經過crash recovery方式執行刷新操做。若是這個參數的值是2,InnoDB會刷新日誌並以冷方式關庫,就像MySQL宕機同樣,沒有提交的事務會丟失,在下一次開啓數據庫時,crash recovery所須要的時間更長;在緊急或排錯情形下,須要馬上關閉數據庫時,會使用這種方式停庫。