1. 程式人生 > 其它 >MySQL 之 主從伺服器搭建 (docker-compose)

MySQL 之 主從伺服器搭建 (docker-compose)

1、環境變數的準備

使用環境變數檔案模式引入環境變數,檔案為: .env

######################### 時區 #####################
TZ=Asia/Shanghai
 
###################### MySQL ################################
# MySQL 版本
MYSQL_VERSION=8.0.20
# MySQL root 密碼
MYSQL_ROOT_PASSWORD=server@Asia
# MySQL 建立一個使用者
MYSQL_USER=not_root_user
# MySQL 建立一個使用者的密碼
MYSQL_PASSWORD=server@Asia

2、docker-compose 檔案編寫:

主服務(和從服務一模一樣): docker-compose.yml:

version: "3.0"
 
services:
  mysql-master:
    env_file: .env
    restart: always
    container_name: xt-mysql-master
    image: mysql:${MYSQL_VERSION}
    ports:
      - "3306:3306"
    volumes:
      # 初始化執行的sql指令碼
- ./mysql/initsql:/docker-entrypoint-initdb.d # 持久化資料掛載 - ./mysql/data:/var/lib/mysql # 配置檔案掛載 - ./mysql/conf:/etc/mysql/conf.d command: --lower_case_table_names=1 network_mode: "host"

從服務(和主服務一模一樣的)

version: "3.0"
 
services:
  mysql-slave:
    env_file: .env
    restart: always
    container_name: mysql
-slave image: mysql:${MYSQL_VERSION} ports: - "3306:3306" volumes: # 初始化執行的sql指令碼 - ./mysql/initsql:/docker-entrypoint-initdb.d # 持久化資料掛載 - ./mysql/data:/var/lib/mysql # 配置檔案掛載 - ./mysql/conf:/etc/mysql/conf.d command: --lower_case_table_names=1 network_mode: "host"

3、MySQL 核心配置編寫:

主伺服器: my.cnf

[mysqld]
# 服務在叢集中的ID (全域性唯一)
server-id=0001
 
# 跳過MySQL 反解析連線客戶端的 DNS
skip-host-cache
skip-name-resolve
 
# 256KB為預設值,請根據實際需要自行擴容
sort_buffer_size=16MB
 
# 忽略的BinLog 庫
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
 
# 僅僅記錄以下表的 Binlog,這裡不指定庫了
#binlog-do-db=admin
 
# BinLog 開啟,配置 其名稱字首
log_bin=ON
log-bin=xt-master-bin
expire-logs-days=14
max-binlog-size=500M
 
pid-file=/var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
 
# 匯入其他配置檔案(可選的)
!includedir /etc/mysql/conf.d

從伺服器配置:my.cnf

[mysqld]
# 服務在叢集中的ID (全域性唯一) server
-id=0002 #跳過MySQL反解析連線客戶端的DNS skip-host-cache skip-name-resolve #忽略複製主庫中的資料庫定義 replicate-ignore-db=information_schema replicate-ignore-db=performance_schema replicate-ignore-db=sys replicate-ignore-db=mysql #需要複製的主庫中的資料庫,引數是在slave上配置,指定slave要複製哪個庫,這裡就不指定庫了 #replicate-do-db=admin #開啟binlog日誌(slave節點可以不用開啟,skip-log-bin表示關閉BinLog) #指定binlog字首 log-bin=xt-slave-bin #關閉binlog skip-log-bin # 匯入其他配置檔案(可選的) !includedir /etc/mysql/conf.d

4、初始化主伺服器連線資訊(從伺服器特有的步驟):

從伺服器需要初始化 主伺服器的連線資訊 ,放在從伺服器中的 initsql 初始化指令碼中,

需要初始化的SQL 指令碼存入路徑內: /docker-entrypoint-initdb.d (COPY 方式拷貝到容器內),

也可以使用掛在的方式與容器同步,使用掛在模式則無需 Dockerfile

# Slave 啟動的時候建立 Master 連結資訊,Host,使用者名稱,密碼
change master to master_host='192.168.1.249',master_user='root',master_password='server@Asia';
 
# 啟動Slave 節點
start slave;

5、完成,然後啟動伺服器即可

docker-compose up mysql-master
docker-compose up mysql-master

可以使用 MySQL 連線工具進行連線測試了

檢視 Slave 狀態:

啟動後檢視Slave 狀態: SLAVE_IO_RUNNING:Yes SLAVE_SQL_RUNNING:Yes

show slave status;

注意:若從表是後期建立的,則需要將主表的建庫建表資訊複製到從表初始化目錄下,或者手動同步主從表的結構,否則:Unknown database 'xxxxx'


補充擴充套件:

binlog相關命令:

show binary logs   #獲取binlog檔案日誌列表
show master status  # 檢視當前正在寫入的binlog檔案
show master logs  # 檢視master上的binlog檔案
show binlog events  #檢視第一個binlog檔案內容
show binlog events 'mysql-bin.000002'  # 檢視指定binlog檔案內容, 如:檢視mysql-bin.000002檔案內容

MySQL 配置檔案介紹:

#*** client options 相關選項 ***#
#以下選項會被MySQL客戶端應用讀取。注意只有MySQL附帶的客戶端應用程式保證可以讀取這段內容。如果你想你自己的MySQL應用程式獲取這些值。需要在MySQL客戶端庫初始化的時候指定這些選項。
[client]
port = 3309
socket =  /usr/local/mysql/tmp/mysql.sock
[mysqld]
!include  /usr/local/mysql/etc/mysqld.cnf 
#包含的配置檔案 ,把使用者名稱,密碼檔案單獨存放
 
port = 3309
bind-address = 0.0.0.0
server-id = 1 
#表示是本機的序號為1,叢集中唯一
 
socket =  /usr/local/mysql/tmp/mysql.sock
pid-file =  /usr/local/mysql/var/mysql.pid
basedir =  /usr/local/mysql/
datadir =  /usr/local/mysql/var/
tmpdir =  /usr/local/mysql/tmp/ 
#此目錄被 MySQL用來儲存臨時檔案.例如,它被用來處理基於磁碟的大型排序,和內部排序一樣,以及簡單的臨時表.如果你不建立非常大的臨時檔案,將其放置到 swapfs/tmpfs 檔案系統上也許比較好。另一種選擇是你也可以將其放置在獨立的磁碟上.你可以使用”;”來放置多個路徑,他們會按照 roud-robin 方法被輪詢使用.
 
slave-load-tmpdir =  /usr/local/mysql/tmp/ 
#當 slave 執行 load data infile 時用
 
 
#*** skip options 相關選項 ***#
skip-name-resolve 
#禁止 MySQL 對外部連線進行 DNS 解析,使用這一選項可以消除 MySQL 進行 DNS 解析的時間。但需要注意,如果開啟該選項,則所有遠端主機連線授權都要使用 IP 地址方式,否則 MySQL 將無法正常處理連線請求!
 
skip-symbolic-links 
#不能使用連線檔案,多個客戶可能會訪問同一個資料庫,因此這防止外部客戶鎖定 MySQL 伺服器。 該選項預設開啟
 
skip-external-locking 
#不使用系統鎖定,要使用 myisamchk,必須關閉伺服器 ,避免 MySQL的外部鎖定,減少出錯機率增強穩定性。
 
skip-slave-start 
#啟動 mysql,不啟動複製
 
skip-networking 
#開啟該選項可以徹底關閉 MySQL 的 TCP/IP 連線方式,如果 WEB 伺服器是以遠端連線的方式訪問 MySQL 資料庫伺服器則不要開啟該選項!否則將無法正常連線! 如果所有的程序都是在同一臺伺服器連線到本地的 mysqld, 這樣設定將是增強安全的方法
 
sysdate-is-now = 1 
#把SYSDATE 函式程式設計為 NOW的別名
 
#*** 系統資源相關選項 ***#
back_log = 50 
#接受佇列,對於沒建立 tcp 連線的請求佇列放入快取中,佇列大小為 back_log,受限制與 OS 引數,試圖設定 back_log 高於你的作業系統的限制將是無效的。預設值為 50。對於 Linux 系統推薦設定為小於512的整數。如果系統在一個短時間內有很多連線,則需要增大該引數的值
 
max_connections = 1000 
#指定MySQL允許的最大連線程序數。如果在訪問資料庫時經常出現"Too Many Connections"的錯誤提 示,則需要增大該引數值。
 
max_connect_errors = 10000 
#如果某個使用者發起的連線 error 超過該數值,則該使用者的下次連線將被阻塞,直到管理員執行 flush hosts ; 命令或者服務重啟, 防止黑客 , 非法的密碼以及其他在連結時的錯誤會增加此值
 
open_files_limit = 10240 
#MySQL開啟的檔案描述符限制,預設最小1024;當open_files_limit沒有被配置的時候,比較max_connections*5和ulimit-n的值,哪個大用哪個,當open_file_limit被配置的時候,比較open_files_limit和max_connections*5的值,哪個大用哪個。
 
connect-timeout = 10 
#連線超時之前的最大秒數,在 Linux 平臺上,該超時也用作等待伺服器首次迴應的時間
 
wait-timeout = 28800 
#等待關閉連線的時間
 
interactive-timeout = 28800 
#關閉連線之前,允許 interactive_timeout(取代了wait_timeout)秒的不活動時間。客戶端的會話 wait_timeout 變數被設為會話interactive_timeout 變數的值。如果前端程式採用短連線,建議縮短這2個值, 如果前端程式採用長連線,可直接註釋掉這兩個選項,預設配置(8小時)  
 
slave-net-timeout = 600 
#從伺服器也能夠處理網路連線中斷。但是,只有從伺服器超過slave_net_timeout 秒沒有從主伺服器收到資料才通知網路中斷
 
net_read_timeout = 30 
#從伺服器讀取資訊的超時
 
net_write_timeout = 60 
#從伺服器寫入資訊的超時
 
net_retry_count = 10 
#如果某個通訊埠的讀操作中斷了,在放棄前重試多次
 
net_buffer_length = 16384 
#包訊息緩衝區初始化為 net_buffer_length 位元組,但需要時可以增長到 max_allowed_packet 位元組
 
max_allowed_packet = 64M
# 服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小(當與大的BLOB 欄位一起工作時相當必要), 每個連線獨立的大小.大小動態增加。 設定最大包,限制server接受的資料包大小,避免超長SQL的執行有問題 預設值為16M,當MySQL客戶端或mysqld
伺服器收到大於 max_allowed_packet 位元組的資訊包時,將發出“資訊包過大”錯誤,並關閉連線。對於某些客戶端,如果通訊資訊包過大,在執行查詢期間,可能會遇到“丟失與 MySQL 伺服器的連線”錯誤。預設值 16M。
 
table_cache = 512 
# 所有執行緒所開啟表的數量. 增加此值就增加了mysqld所需要的檔案描述符的數量這樣你需要確認在[mysqld_safe]中 “open-files-limit” 變數設定開啟檔案數量允許至少4096
 
thread_stack = 192K 
# 執行緒使用的堆大小. 此容量的記憶體在每次連線時被預留.MySQL 本身常不會需要超過 64K 的記憶體如果你使用你自己的需要大量堆的 UDF 函式或者你的作業系統對於某些操作需要更多的堆,你也許需要將其設定的更高一點.預設設定足以滿足大多數應用
 
thread_cache_size = 20 
# 我們在 cache 中保留多少執行緒用於重用.當一個客戶端斷開連線後,如果 cache 中的執行緒還少於 thread_cache_size,則客戶端執行緒被放入 cache 中.這可以在你需要大量新連線的時候極大的減少執行緒建立的開銷(一般來說如果你有好的執行緒模型的話,
這不會有明顯的效能提升.)伺服器執行緒快取這個值表示可以重新利用儲存在快取中執行緒的數量,當斷開連線時如果快取中還有空間,那麼客戶端的執行緒將被放到快取中,如果執行緒重新被請求,那麼請求將從快取中讀取,如果快取中是空的或者是新的請求,那麼這個執行緒將被重新建立,
如果有很多新的執行緒,增加這個值可以改善系統性能.通過比較 Connections 和 Threads_created 狀態的變數,可以看到這個變數的作用
根據實體記憶體設定規則如下:
1G  —> 8
2G  —> 16
3G  —> 32
大於3G  —> 64
 
thread_concurrency = 8 
#此允許應用程式給予執行緒系統一個提示在同一時間給予渴望被執行的執行緒的數量.該引數取值為伺服器邏輯CPU數量×2,在本例中,伺服器有 2 顆物理CPU,而每顆物理CPU又支援H.T超執行緒,所以實際取值為 4 × 2 = 8.設定 thread_concurrency的值的正確與否, 
對 mysql 的效能影響很大, 在多個 cpu(或多核)的情況下,錯誤設定了 thread_concurrency 的值, 會導致 mysql 不能充分利用多 cpu(或多核),出現同一時刻只能一個 cpu(或核)在工作的情況。 thread_concurrency 應設為 CPU 核數的 2 倍.比如有一個雙核的 CPU, 
那麼 thread_concurrency 的應該為 4; 2 個雙核的 cpu,thread_concurrency 的值應為 8,屬重點優化引數
 
 
#*** qcache settings 相關選項 ***#
query_cache_limit = 2M 
#不快取查詢大於該值的結果.只有小於此設定值的結果才會被緩衝,  此設定用來保護查詢緩衝,防止一個極大的結果集將其他所有的查詢結果都覆蓋.
 
query_cache_min_res_unit = 2K 
#查詢快取分配的最小塊大小.預設是 4KB,設定值大對大資料查詢有好處,但如果你的查詢都是小資料查詢,就容易造成記憶體碎片和浪費
查詢快取碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢快取碎片率超過 20%,可以用 FLUSH QUERY CACHE 整理快取碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小資料量的話。
查詢快取利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size *100%
查詢快取利用率在 25%以下的話說明 query_cache_size 設定的過大,可適當減小;查詢快取利用率在 80%以上而且 Qcache_lowmem_prunes > 50 的話說明 query_cache_size 可能有點小,要不就是碎片太多。
查詢快取命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
 
query_cache_size = 64M  
#指定 MySQL 查詢緩衝區的大小。可以通過在 MySQL 控制檯執行以下命令觀察:
程式碼:
> SHOW VARIABLES LIKE '%query_cache%';
> SHOW STATUS LIKE 'Qcache%';如果 Qcache_lowmem_prunes 的值非常大,則表明經常出現緩衝不夠的情況;
如果 Qcache_hits 的值非常大,則表明查詢緩衝使用非常頻繁,如果該值較小反而會影響效率,那麼可以考慮不用查詢緩衝; Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多。
memlock # 如果你的系統支援 memlock() 函式,你也許希望開啟此選項用以讓執行中的 mysql 在在記憶體高度
緊張的時候,資料在記憶體中保持鎖定並且防止可能被 swapping out,此選項對於效能有益
 
#*** default settings 相關選項 ***#
default_table_type = InnoDB 
# 當建立新表時作為預設使用的表型別,如果在建立表示沒有特別執行表型別,將會使用此值
 
default-time-zone = system 
#伺服器時區
 
character-set-server = utf8 
#server 級別字符集
 
default-storage-engine = InnoDB 
#預設儲存引擎
 
#*** tmp && heap settings 相關選項 ***#
tmp_table_size = 512M 
#臨時表的最大大小,如果超過該值,則結果放到磁碟中,此限制是針對單個表的,而不是總和.
 
max_heap_table_size = 512M 
#獨立的記憶體表所允許的最大容量.此選項為了防止意外建立一個超大的記憶體表導致永盡所有的記憶體資源.
 
#*** log settings 相關選項 ***#
# BinLog 日誌字首
log-bin = mysql-bin 
 
# binlog 日誌檔案儲存位置,預設 /var/lib/mysql
log-bin=/var/lib/mysql
 
#開啟二進位制日誌功能.在複製(replication)配置中,作為 MASTER 主伺服器必須開啟此項.如果你需要從你最後的備份中做基於時間點的恢復,你也同樣需要二進位制日誌.這些路徑相對於 datadir
 
log_slave_updates = 1 
#表示slave將複製事件寫進自己的二進位制日誌
 
log-bin-index = mysql-bin.index 
#二進位制的索引檔名
 
relay-log = relay-log 
#定義relay_log的位置和名稱,如果值為空,則預設位置在資料檔案的目錄,檔名為host_name-relay-bin.nnnnnn(By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory);
 
relay_log_index = relay-log.index  
#relay-log的索引檔名
 
log-warnings = 1 
# 將警告列印輸出到錯誤 log 檔案.如果你對於MySQL有任何問題,你應該開啟警告 log 並且仔細審查錯誤日誌,查出可能的原因.
 
#錯誤日誌路徑
log-error =  /usr/local/mysql/log/mysql.err 
 
log_output = FILE 
#引數 log_output 指定了慢查詢輸出的格式,預設為 FILE,你可以將它設為 TABLE,然後就可以查詢 mysql 架構下的 slow_log 表了
 
log_slow_queries 
#指定是否開啟慢查詢日誌(該引數要被slow_query_log取代,做相容性保留)
 
slow_query_log = 1 
# 指定是否開啟慢查詢日誌. 慢查詢是指消耗了比 “long_query_time” 定義的更多時間的查詢.如果 log_long_format 被開啟,那些沒有使用索引的查詢也會被記錄.如果你經常增加新查詢到已有的系統內的話. 一般來說這是一個好主意,
 
long-query-time = 1 
#設定慢查詢的閥值,超出次設定值的SQL即被記錄到慢查詢日誌,預設值為10s.所有的使用了比這個時間(以秒為單位)更多的查詢會被認為是慢速查詢.不要在這裡使用”1″, 否則會導致所有的查詢,甚至非常快的查詢頁被記錄下來(由於MySQL 目前時間的精確度只能達到秒的級別).
 
log_long_format 
# 在慢速日誌中記錄更多的資訊.一般此項最好開啟,開啟此項會記錄使得那些沒有使用索引的查詢也被作為到慢速查詢附加到慢速日誌裡
 
slow_query_log_file =  /usr/local/mysql/log/slow.log 
# 指定慢日誌檔案存放位置,可以為空,系統會給一個預設的檔案host_name-slow.log
 
log-queries-not-using-indexes 
#如果執行的SQL語句沒有使用索引,則mysql資料庫同樣會將這條SQL語句記錄到慢查詢日誌檔案中。
 
min_examined_row_limit=1000    
#記錄那些由於查找了多餘1000次而引發的慢查詢
 
long-slow-admin-statements    
#記錄那些慢的optimize table,analyze table和alter table語句
 
log-slow-slave-statements 
#記錄由Slave所產生的慢查詢
 
general_log = 1 
#將所有到達MySQL Server的SQL語句記錄下來,預設關閉 
 
general_log_file =  /usr/local/mysql/log/mysql.log 
#general_log路徑
 
max_binlog_size = 1G 
#如果二進位制日誌寫入的內容超出給定值,日誌就會發生滾動。你不能將該變數設定為大於1GB或小於4096位元組。 預設值是1GB。如果你正使用大的事務,二進位制日誌還會超過max_binlog_size
 
max_relay_log_size = 1G 
#標記relaylog允許的最大值,如果該值為0,則預設值為max_binlog_size(1G);如果不為0,則max_relay_log_size則為最大的relay_log檔案大小;
 
relay-log-purge = 1 
#是否自動清空不再需要中繼日誌時。預設值為1(啟用)
 
expire_logs_days = 30 
#超過 30 天的 binlog 刪除
 
binlog_cache_size = 1M 
# 在一個事務中 binlog 為了記錄 SQL 狀態所持有的 cache 大小,如果你經常使用大的,多宣告的事務,你可以增加此值來獲取更大的效能.所有從事務來的狀態都將被緩衝在 binlog 緩衝中然後在提交後一次性寫入到 binlog 中,如果事務比此值大, 會使用磁碟上的臨時檔案來替代.此緩衝在每個連線的事務第一次更新狀態時被建立.session 級別
 
replicate-wild-ignore-table = mysql.% 
#複製時忽略資料庫及表
slave_skip_errors=all 
#定義複製過程中從伺服器可以自動跳過的錯誤號,當複製過程中遇到定義的錯誤號,就可以自動跳過,直接執行後面的SQL語句。
slave_skip_errors選項有四個可用值,分別為:off,all,ErorCode,ddl_exist_errors。
  預設情況下該引數值是off,我們可以列出具體的error code,也可以選擇all,mysql5.6及MySQL Cluster NDB 7.3以及後續版本增加了引數ddl_exist_errors,該引數包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
    一些error code代表的錯誤如下:
    1007:資料庫已存在,建立資料庫失敗
    1008:資料庫不存在,刪除資料庫失敗
    1050:資料表已存在,建立資料表失敗
    1051:資料表不存在,刪除資料表失敗
    1054:欄位不存在,或程式檔案跟資料庫有衝突
    1060:欄位重複,導致無法插入
    1061:重複鍵名
    1068:定義了多個主鍵
    1094:位置執行緒ID
    1146:資料表缺失,請恢復資料庫
    1053:複製過程中主伺服器宕機
    1062:主鍵衝突 Duplicate entry '%s' for key %d
    
    
#*** MyISAM 相關選項 ***#
key_buffer_size = 256M 
#指定用於索引的緩衝區大小,增加它可得到更好的索引處理效能。如果是以InnoDB引擎為主的DB,專用於MyISAM引擎的 key_buffer_size 可以設定較小,8MB 已足夠  如果是以MyISAM引擎為主,可設定較大,但不能超過4G. 在這裡,強烈建議不使用MyISAM引擎,預設都是用InnoDB引擎.注意:該引數值設定的過大反而會是伺服器整體效率降低!
 
sort_buffer_size = 2M 
#查詢排序時所能使用的緩衝區大小。排序緩衝被用來處理類似 ORDER BY 以及 GROUP BY 佇列所引起的排序.一個用來替代的基於磁碟的合併分類會被使用.檢視 “Sort_merge_passes” 狀態變數. 在排序發生時由每個執行緒分配 注意:該引數對應的分配記憶體是每連線獨佔!如果有 100 個連線,那麼實際分配的總共排序緩衝區大小為 100 × 6 =600MB,所以,對於記憶體在 4GB 左右的伺服器推薦設定為 6-8M。 
 
read_buffer_size = 2M 
#讀查詢操作所能使用的緩衝區大小。和 sort_buffer_size 一樣,該引數對應的分配記憶體也是每連線獨享!用來做 MyISAM 表全表掃描的緩衝大小.當全表掃描需要時,在對應執行緒中分配.
 
join_buffer_size = 8M 
#聯合查詢操作所能使用的緩衝區大小,和 sort_buffer_size 一樣,該引數對應的分配記憶體也是每連線獨享!此緩衝被使用來優化全聯合(full JOINs 不帶索引的聯合).類似的聯合在極大多數情況下有非常糟糕的效能表現, 但是將此值設大能夠減輕效能影響.通過 “Select_full_join”狀態變數檢視全聯合的數量, 當全聯合發生時,在每個執行緒中分配。
 
read_rnd_buffer_size = 8M 
#MyISAM 以索引掃描(Random Scan)方式掃描資料的 buffer大小 
 
bulk_insert_buffer_size = 64M 
#MyISAM 使用特殊的類似樹的 cache 來使得突發插入(這些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATAINFILE) 更快. 此變數限制每個程序中緩衝樹的位元組數.設定為 0 會關閉此優化.為了最優化不要將此值設定大於 “key_buffer_size”.當突發插入被檢測到時此緩衝將被分配MyISAM 用在塊插入優化中的樹緩衝區的大小。註釋:這是一個 per thread 的限制 ( bulk 大量).此緩衝當 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE到一個空表中引起重建索引時被分配.這在每個執行緒中被分配.所以在設定大值時需要小心.
 
myisam_sort_buffer_size = 64M 
#MyISAM 設定恢復表之時使用的緩衝區的尺寸,當在REPAIR TABLE 或用 CREATE INDEX 建立索引或 ALTER TABLE 過程中排序 MyISAM 索引分配的緩衝區
 
myisam_max_sort_file_size = 10G
#mysql重建索引時允許使用的臨時檔案最大大小
 
myisam_repair_threads = 1 
#如果該值大於 1,在 Repair by sorting 過程中並行建立MyISAM 表索引(每個索引在自己的執行緒內).如果一個表擁有超過一個索引, MyISAM 可以通過並行排序使用超過一個執行緒去修復他們.這對於擁有多個 CPU 以及大量記憶體情況的使用者,是一個很好的選擇.
 
myisam_recover = 64K
#允許的 GROUP_CONCAT()函式結果的最大長度
transaction_isolation = REPEATABLE-READ # 設定預設的事務隔離級別.可用的級別如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE
1.READ UNCOMMITTED-讀未提交 2.READ COMMITTE-讀已提交 3.REPEATABLE READ -可重複讀 4.SERIALIZABLE -序列
 
 
# *** INNODB 相關選項 ***#
skip-innodb 
# 如果你的 MySQL 服務包含 InnoDB 支援但是並不打算使用的話,使用此選項會節省記憶體以及磁碟空間,並且加速某些部分
 
innodb_file_per_table = 1 
# InnoDB為獨立表空間模式,每個資料庫的每個表都會生成一個數據空間
獨立表空間優點:
1.每個表都有自已獨立的表空間。
2.每個表的資料和索引都會存在自已的表空間中。
3.可以實現單表在不同的資料庫中移動。
4.空間可以回收(除drop table操作處,表空不能自已回收)
缺點:
1.單表增加過大,如超過100G
結論:
共享表空間在Insert操作上少有優勢。其它都沒獨立表空間表現好。當啟用獨立表空間時,請合理調整:innodb_open_files
 
innodb_status_file = 1 
#啟用InnoDB的status file,便於管理員檢視以及監控等
 
innodb_open_files = 2048 
# 限制Innodb能開啟的表的資料,如果庫裡的表特別多的情況,請增加這個。這個值預設是300
 
innodb_additional_mem_pool_size = 100M 
#設定InnoDB儲存引擎用來存放資料字典資訊以及一些內部資料結構的記憶體空間大小,所以當我們一個MySQL Instance中的資料庫物件非常多的時候,是需要適當調整該引數的大小以確保所有資料都能存放在記憶體中提高訪問效率的。 
 
innodb_buffer_pool_size = 2G 
#包括資料頁、索引頁、插入快取、鎖資訊、自適應雜湊所以、資料字典資訊.InnoDB 使用一個緩衝池來儲存索引和原始資料, 不像 MyISAM.這裡你設定越大,你在存取表裡面數據時所需要的磁碟 I/O 越少.在一個獨立使用的資料庫伺服器上,你可以設定這個變數到伺服器實體記憶體大小的 80%,不要設定過大,否則,由於實體記憶體的競爭可能導致作業系統的換頁顛簸.注意在 32 位系統上你每個程序可能被限制在 2-3.5G 使用者層面記憶體限制,所以不要設定的太高.
 
innodb_write_io_threads = 4
innodb_read_io_threads = 4
# innodb使用後臺執行緒處理資料頁上的讀寫 I/O(輸入輸出)請求,根據你的 CPU 核數來更改,預設是4
# 注:這兩個引數不支援動態改變,需要把該引數加入到my.cnf裡,修改完後重啟MySQL服務,允許值的範圍從 1-64
 
innodb_data_home_dir =  /usr/local/mysql/var/ 
#設定此選項如果你希望 InnoDB 表空間檔案被儲存在其他分割槽.預設儲存在 MySQL 的 datadir 中.
 
innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend
#InnoDB將資料儲存在一個或者多個數據檔案中成為表空間.如果你只有單個邏輯驅動儲存你的資料,一個單個的自增檔案就足夠好了.其他情況下.每個裝置一個檔案一般都是個好的選擇.你也可以配置 InnoDB 來使用裸盤分割槽 – 請參考手冊來獲取更多相關內容
 
innodb_file_io_threads = 4 
#用來同步 IO 操作的 IO 執行緒的數量. 此值在 Unix 下被硬編碼為 4,但是在 Windows 磁碟 I/O 可能在一個大數值下表現的更好.
 
innodb_thread_concurrency = 16
#在 InnoDb 核心內的允許執行緒數量,InnoDB 試著在 InnoDB 內保持作業系統執行緒的數量少於或等於這個引數給出的限制,最優值依賴於應用程式,硬體以及作業系統的排程方式.過高的值可能導致執行緒的互斥顛簸.預設設定為 0,表示不限制併發數,這裡推薦設定為0,更好去發揮CPU多核處理能力,提高併發量
 
innodb_flush_log_at_trx_commit = 1 
#如果設定為 1 ,InnoDB 會在每次提交後重新整理(fsync)事務日誌到磁碟上,這提供了完整的 ACID 行為.如果你願意對事務安全折衷, 並且你正在執行一個小的食物, 你可以設定此值到 0 或者 2 來減少由事務日誌引起的磁碟 I/O
代表日誌只大約每秒寫入日誌檔案並且日誌檔案重新整理到磁碟.
代表日誌寫入日誌檔案在每次提交後,但是日誌檔案只有大約每秒才會重新整理到磁碟上.
 
innodb_log_buffer_size = 8M 
#用來緩衝日誌資料的緩衝區的大小.當此值快滿時, InnoDB 將必須重新整理資料到磁碟上.由於基本上每秒都會重新整理一次,所以沒有必要將此值設定的太大(甚至對於長事務而言)
 
innodb_log_file_size = 500M 
#事物日誌大小.在日誌組中每個日誌檔案的大小,你應該設定日誌檔案總合大小到你緩衝池大小的5%~100%,來避免在日誌檔案覆寫上不必要的緩衝池重新整理行為.不論如何, 請注意一個大的日誌檔案大小會增加恢復程序所需要的時間.
 
innodb_log_files_in_group = 2 
#在日誌組中的檔案總數.通常來說 2~3 是比較好的.
 
innodb_log_group_home_dir =  /usr/local/mysql/var/
# InnoDB 的日誌檔案所在位置. 預設是 MySQL 的 datadir.你可以將其指定到一個獨立的硬碟上或者一個 RAID1 捲上來提高其效能innodb_max_dirty_pages_pct = 90 #innodb 主執行緒重新整理快取池中的資料,使髒資料比例小於 90%,這是一個軟限制,不被保證絕對執行.
 
innodb_lock_wait_timeout = 50 
#InnoDB 事務在被回滾之前可以等待一個鎖定的超時秒數。InnoDB 在它自己的 鎖定表中自動檢測事務死鎖並且回滾事務。 InnoDB 用 LOCK TABLES 語句注意到鎖定設定。預設值是 50 秒
 
innodb_flush_method = O_DSYNC 
# InnoDB 用來重新整理日誌的方法.表空間總是使用雙重寫入重新整理方法.預設值是 “fdatasync”, 另一個是 “O_DSYNC”.
 
innodb_force_recovery=1
# 如果你發現 InnoDB 表空間損壞, 設定此值為一個非零值可能幫助你匯出你的表.從1 開始並且增加此值知道你能夠成功的匯出表.
 
innodb_fast_shutdown 
# 加速 InnoDB 的關閉. 這會阻止 InnoDB 在關閉時做全清除以及插入緩衝合併.這可能極大增加關機時間, 但是取而代之的是 InnoDB 可能在下次啟動時做這些操作.
 
 
 
# *** 其他 相關選項 ***#
[mysqldump]
quick 
#支援較大資料庫的轉儲,在匯出非常巨大的表時需要此項。增加該變數的值十分安全,這是因為僅當需要時才會分配額外記憶體。例如,僅當你發出長查詢或mysqld必須返回大的結果行時mysqld才會分配更多記憶體。該變數之所以取較小預設值是一種預防措施,以捕獲客戶端和伺服器之間的錯誤資訊包,並確保不會因偶然使用大的資訊包而導致記憶體溢位。 如果你正是用大的BLOB值,而且未為mysqld授予為處理查詢而訪問足夠記憶體的許可權,也會遇到與大資訊包有關的奇怪問題。如果懷疑出現了該情況,請嘗試在mysqld_safe指令碼開始增加ulimit -d 256000,並重啟mysqld。
 
[mysql]
auto-rehash 
#允許通過 TAB 鍵提示
 
default-character-set = utf8 
#資料庫字符集
 
connect-timeout = 3
[mysqld_safe]
 
open-files-limit = 8192 
#增加每個程序的可開啟檔案數量.確認你已經將全系統限制設定的足夠高!開啟大量表需要將此值設大

......

本文來自部落格園,作者:Vermeer,轉載請註明原文連結:https://www.cnblogs.com/Alay/p/15650522.html