【查閱】mysql配置文件/參數文件重要參數筆錄(my.cnf)


 持續更新,積累自己對參數的理解

 【1】my.cnf參數

[client]
port = 3306
socket = /mysql/data/3306/mysql.sock
default-character-set=utf8

[mysql] #mysql 命令參數
auto-rehash  #可以使用tab鍵自動補全表名、列名等
default-character-set = utf8
connect-timeout = 10
prompt=\U|\d> #mysql登錄上之后,顯示用戶名與數據庫名
[mysqld]  #mysqld服務啟動命令參數

#【0】目錄文件基本設置
basedir=/mysql/app/mysql  #mysql基本目錄(文件解壓所在目錄)
datadir=/mysql/data/3306/data  #mysql數據目錄
socket=/mysql/data/3306/mysql.sock  #sock套接字文件位置
pid-file=/mysql/data/3306/mysql.pid  #pid文件存放位置
port=3306  #端口號
lower_case_table_names = 1 #【1】表名存儲在磁盤是小寫的,字符比較的時候不區分大小寫。【0】表名存儲為給定的大小,比較是區分大小寫的 【2】表名存儲為給定的大小寫但是比較的時候是小寫的   linux默認為0,windows下默認是1,mac Os 下默認是2
default-storage-engine=INNODB  #設置默認存儲引擎
max-allowed-packet = 32M  #備份的時候,很需要調整這個參數
default-timezone = name  #為MySQL服務器設置一個地理時區(如果它與本地計算機的地理時區不一樣)。比如:default-time-zone = '+8:00'
secure_auth = 1 #導出開關,1為開啟,0為禁用
secure_file_priv=/tmp #null 為禁用,/path 為指定導出位置(只能導出到這select output file),如果不能用,請查看selinux是否關閉
default_authentication_plugin=mysql_native_password #修改默認加密方式 【8.0以后】
auto_increment_increment控制列中的值的增量值,也就是步長。
auto_increment_offset確定AUTO_INCREMENT列值的起點,也就是初始值。


#語言設置
character-set-server=utf8  #默認服務端字符集
collation_server=utf8_general_ci #默認服務端排序規則
skip-character-set-client-handshake  #不受client字符集影響,使用sever端字符集
#lanuage=name #用指定的語言顯示出錯誤信息,默認為英語

#通信、權限、執行
autocommit=1  #是否自動提交事務,5.6這個參數需要注釋掉才方便安裝初始化
safe-user-create  #只有在mysql.useri數據庫表上擁有insert權限的用戶才能使用GRANT命令;這是一種雙保險機制(且此用戶還必須有with grant option權限)
#shared-memory  #共享內存通信,僅僅適用於windows
#skip-grant-tables  #跳過權限表,可以免密進入mysql,windows下可能需要結合shared-memory來使用
#skip-host-cache  #不使用高速緩存區來存放主機名和IP地址的對應關系。
#skip-networking  #不允許遠程TCP連接,只允許通過一個套接字文件(Unix/Linux系統)或通過命名管道(Windows系統)進行本地連接
user=mysql  #mysqld程序在啟動后將在給定UNIX/Linux賬戶下執行
transaction-isolation=read-committed #事務的隔離級別
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  #sql_mode設置
group_concat_max_len =99999  #sql中group_concat的最大字符串長度



#內存管理、優化、查詢緩存、工具組件
bulk_insert_buffer_size=10M  #為一次插入多條新記錄的INSERT命令分配的緩存區長度(默認設置是8M)。大數據量插入可以提高到該值
key_buffer_size = 100M  #用來存放索引區塊的RMA值(默認設置是8M)。
join_buffer_size = 2M  #在參加JOIN操作的數據列沒有索引時為JOIN操作分配的緩存區長度(默認設置是128K)。
max_heap_table_size = 96M  #HEAP數據表的最大長度(默認設置是16M);超過這個長度的HEAP數據表將被存入一個臨時文件而不是駐留在內存里
max_connections = 10000  #MySQL服務器同時處理的數據庫連接的最大數量(默認設置是100)。
query_cache_limit = 4M  #允許臨時存放在查詢緩存區里的查詢結果的最大長度(默認設置是1M)。
query_cache_size = 256M  #查詢緩存區的最大長度(默認設置是0,不開辟查詢緩存區)。
query_cache_type = 1  #查詢緩存區的工作模式:0, 禁用查詢緩存區; 1,啟用查詢緩存區(默認設置); 2,”按需分配”模式,只響應SELECT SQL_CACHE命令。
sort_buffer = 300M  #為排序操作分配的緩存區的長度(默認設置是2M);如果這個緩存區太小,則必須創建一個臨時文件來進行排序。
table_cache = 128  #同時打開的數據表的數量(默認設置是64)。
tmp_table_size = 96M  #臨時HEAP數據表的最大長度(默認設置是32M);超過這個長度的臨時數據表將被轉換為MyISAM數據表並存入一個臨時文件。
table_open_cache=2048 #同事打開表的緩存數,如果過少而連接過多會導致opening table卡頓,show status like '%open%';查看當前打開的表,flush tables;會清空表緩存
max_allowed_packet = 16M #網絡數據包大小,影響比如單條比較大的數據包會插入失敗等等,也影響mysqldump等工具使用
tmp_table_size=128M #tmp_table_size選項來增加一張臨時表的大小,例如做高級GROUP BY操作生成的臨時表。如果超過該大小值,可能會生成MyISAM的硬盤表導致很慢。默認為16M,可調到64-256最佳,線程獨占,太大可能內存不夠I/O堵塞
max_heap_table_size=128M #最大堆表/內存表大小,常與tmp_table_size一起用,如果它比 tmp_table_size小,則以它為准;

 
         
#告警
#log_warnings=1 #告警信息處理; 【默認值】為1;【為0】表示不記錄告警信息;【為1】記錄告警信息到錯誤日志;【大於1】表示各類告警信息,例如有關網絡故障的信息和重新連接信息寫入錯誤日志。【用於】常用於5.6之前,8.0.3版本已經移除
log-error_verbosity=3 # 信息處理;
【默認值】8.0.3前默認為3,8.0.4后默認為2【參數值】【為1】錯誤信息 ;【為2】錯誤信息和告警信息 ;【為3】錯誤信息、告警信息和通知信息 ;


#mysql用戶的加密方式
default_authentication_plugin=mysql_native_password #參考:mysql8無法用navicat連接(mysql8加密方式的坑)

#【1】日志
#錯誤日志

log-error=/mysql/log/3306/mysql.err #如果錯誤日志文件不存在,mysql啟動或者執行flush logs(如果有就會覆蓋現有的)時會創建新的日志文件

#binlog二進制日志參數
log_bin = /mysql/log/3306/binlog/mysql-bin #可以使用reset master重建。這里定義的只是一個索引文件,例如這里給/log/binlog,那么會生成binlog.index,而實際存放數據是類似於binlog.00001 之類的,超出范圍會繼續新建binlog.00002,以此類推
expire_logs_days=10     #清除binlog文件中超過10天的內容,默認值為0,表示“沒有自動刪除”。當mysql啟動或刷新二進制日志時可能刪除該文件
max_binlog_size=1G    #單個binlog文件的最大容量,如果有大事務運行,運行到一半binlog到達最大值了這個時候不會立馬新建,而是會持續寫到這個文件里,所以有binlog超出該值也正常。
log_bin_index=/mysql/log/3306/binlog/mysql-bin.index  #如果不寫這個,那么默認就是log-bin制定的路徑和名字.index
binlog_format=row  #(如果是復制必須要開行模式,還有statement,mix模式)
binlog_rows_query_log_events=on  #二進制查詢日志事件記錄(即在Binlog里面也會記錄詳細的SQL)
sync_binlog=1   #【1】默認1,mysql每次提交事務之前都會將事務記錄同步到二進制日志磁盤上,【2】0為自動控制 【3】N為每N個事務提交落地一次磁盤

binlog_row_image=full  #(full,minimal,noblob),分別表示binlog中內容全記錄,只記錄被操作的,和不記錄二進制
binlog-do-db = dbname  #只把給定數據庫里的變化情況記入二進制日志文件,其他數據庫里的變化情況不記載。如果需要記載多個數據庫里的變化情況,就必須在配置文件使用多個本選項來設置,每個數據庫一行。
binlog-ignore-db = dbname  #不把給定數據庫里的變化情況記入二進制日志文件。每制指定一個數據庫,需要用本參數多另起一行

#slow慢日志
#log-slow-queries=/mysql/log/3306/slow.log  #開啟慢查詢日志並制定路徑
slow_query_log = 1  #開啟1開啟0關閉,如果寫了下面的slow_query_log_file參數,這個參數會默認為1 slow_query_log_file=/mysql/log/3306/slow.log  #開啟后指定日志文件路徑
long_query_time = 10  #慢查詢判斷時間/s,為0記錄所有查詢,5.5開始支持毫秒級
log_queries_not_using_indexes=on #默認值off,但on時,將沒有使用索引的SQL記錄到慢查詢日志
log_throttle_queries_not_using_indexes=10  #默認值0,即默認1分鍾刷一次。表示每1分鍾記錄下所有未使用索引的SQL(5.6以后才有此參數)。建議10分鍾以上
log_output=FILE  #默認是FILE(FILE|TABLE|NONE),table:mysq..slow_log(該表默認是CSV引擎,建議關閉slow_query_log,再把它轉成myIsam
min_examined_row_limit=1000 #掃描記錄小於改值的SQL不記錄到慢查詢日志
log_throttle_queries_not_using_indexes #限制每分鍾記錄沒有使用索引SQL語句的次數 5.6開始支持
log-slow-admin-statement=1 #記錄管理操作,如ALTER/ANALYZE TABLE
log_slow_slave_statements=1 #在從服務上開啟慢查詢日志
log_timestamps=1        #寫入時區時間戳信息 5.7支持
slow_launch_time=2 #慢查詢超過的執行時間值


#general通用日志
log=/mysql/log/3306/general.log #可以指定通用日志文件,也可以只寫一個log(默認路徑)
general_log_file = /mysql/log/3306/mysql.log #也可以用這種方式
general_log = 1 #啟用通用日志,如果寫了log= ,那么這個默認開啟,值為1

#relay log 中繼日志

relay_log=/mysql/log/3306/relaylog/mysql-relay.log
relay-log-recover=1 #默認為0,開啟為1后:當slave從庫宕機后,假如relay-log損壞了(I/O thread crash safe),
            #導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log並在文件中刪除這部分,並且重新從master上獲取日志,這樣就保證了relay-log的完整性
relay_log_info_repository = TABLE #默認為file,設置table后:relay-info將寫入到 mysql.slave_relay_log_info(該參數為了保護SQL線程安全)
master_info_repository=table = TABLE #默認為file,#設置為table后,master-info將信息保存到mysql.slave_master_info(該參數為了保護IO線程安全)


#【2】innodb 基本設置、表空間文件設置
#skip-innodb  #不加載InnoDB數據表驅動程序–如果用不着InnoDB數據表,可以用這個選項節省一些內存。
#innodb_data_home_dir = path/file  #InnoDB主目錄,所有與InnoDB數據表有關的目錄或文件路徑都相對於這個路徑。在默認的情況下,這個主目錄就是MySQL的數據目錄。
innodb-file-per-table  #啟用獨立表空間
innodb-open-file = 1000  #InnoDB數據表驅動程序最多可以同時打開的文件數(默認設置是300)。如果使用了innodb-file-per-table選項並且需要同時打開很多數據表的話,這個數字很可能需要加大。
innodb_data_file_path=ibdata1:1G;ibdata2:1G:autoextend:max:5G #系統表空間、數據字典、redo、沒有開啟獨立表空間時的共享表空間,初始化最大1G但可以擴容
innodb_lock_wait_timeout = 50  #如果某個事務在等待n秒(s)后還沒有獲得所需要的資源,就使用ROLLBACK命令放棄這個事務。這項設置對於發現和處理未能被InnoDB數據表驅動程序識別出來的死鎖條件有着重要的意義。這個選項的默認設置是50s。
innodb_fast_shutdown=1  #是否以最快的速度關閉InnoDB,默認設置是1,意思是不把緩存在INSERT緩存區的數據寫入數據表,那些數據將在MySQL服務器下次啟動時再寫入 (這么做沒有什么風險,因為INSERT緩存區是表空間的一個組成部分,數據不會丟失)。
                #把這個選項設置為0反而危險,因為在計算機關閉時,InnoDB驅動程序很可能沒有足夠的時間完成它的數據同步工作,操作系統也許會在它完成數據同步工作之前強行結束InnoDB,而這會導致數據不完整。
#innodb 日志
innodb_log_group_home_dir = /mysql/data/3306/data  #用來存放InnoDB日志文件(redo)的目錄路徑(如ib_logfile0、ib_logfile1等)。在默認的情況下,InnoDB驅動程序將使用 MySQL數據目錄作為自己保存日志文件的位置。
innodb_log_files_in_group = 2  #redo文件的個數,默認為2。innodb以輪轉方式依次填寫
innodb_flush_log_at_trx_commit=1  #【1】默認1,每當有事務提交時,mysql都會把內存中的log buffer的數據寫入log file並持久化到磁盤上去 【2】0為操作系統自動控制 【3】N為每N個事務提交落地一次磁盤
#innodb_flush_method = x  #InnoDB日志文件的同步辦法(僅適用於UNIX/Linux系統)。這個選項的可取值有兩種: fdatasync,用fsync()函數進行同步; O_DSYNC,用O_SYNC()函數進行同步。
innodb_undo_directory = /undolog/ #undo獨立存放文件目錄,mysql5.6后,innodb_undo_tablespace參數可以獨立設置undo 日志,
innodb_undo_logs = 128      #單位M,
innodb_undo_tablespaces = 3   #開啟獨立存放undo的參數,這里的值代表是文件個數

#innodb 緩存區的設置和優化
innodb_log_buffer_pool_size = 100M  #緩存池大小(默認設置是8MB),如果獨立DB,建議設置成80%物理內存大小
innodb_log_buffer_size = 16M  #事務日志文件寫操作緩存區的最大長度(默認設置是1MB)。
innodb_additional_men_pool_size = 100M  #
為用於內部管理的各種數據結構分配的緩存區最大長度(默認設置是1MB)
innodb_file_io_threads = 4  #I/O操作(硬盤寫操作)的最大線程個數(默認設置是4)。
innodb_thread_concurrency = 8  #InnoDB驅動程序能夠同時使用的最大線程個數(默認設置是8)。
innodb_buffer_pool_load_at_startup = 1 #啟動MySQL服務時,MySQL將本地熱數據加載到InnoDB緩沖池中 預熱
innodb_buffer_pool_dump_at_shutdown = 1 #停止MySQL服務時,InnoDB將InnoDB緩沖池中的熱數據保存到本地硬盤#
innodb_buffer_pool_dump_pct = 40 #關閉mysql服務時,轉儲活躍使用的innodb buffer pages的比例,默認25%(即100頁熱數據轉儲25頁);配合innodb_buffer_pool_load_at_startup和innodb_buffer_pool_dump_at_shutdown 兩個參數同時使用#
innodb_page_size=8096 #innodb頁大小,默認為16K,這里設置成了8K
innodb_change_buffer_max_size=25 #innodb的insert buffer/change buff ,默認25%,標識最大占innodb buffer pool size的 25%
innodb_change_buffering=all #inserts、deletes、purges、changes(inserts和deletes)、all(默認)、none。


#【3】replication 復制常用參數 參考:https://www.cnblogs.com/gered/p/11368636.html
bind-address=192.168.1.201 #綁定IP地址
server_id=2013306 #標識復制機器唯一性的服務id,建議 ip+端口
skip_name_resolve=off #跳過主機名/域名解析(不推薦使用,默認關閉)
log-slave-updates  #啟用從屬服務器上的日志功能,使這台計算機可以用來構成一個鏡像鏈(A->B->C)。
master-host = hostname #主控服務器的主機名或IP地址。如果從屬服務器上存在mater.info文件(鏡像關系定義文件),它將忽略此選項
master-user = replicusername  #從屬服務器用來連接主控服務器的用戶名。如果從屬服務器上存在mater.info文件,它將忽略此選項。
master-password = passwd  #從屬服務器用來連接主控服務器的密碼。如果從屬服務器上存在mater.info文件,它將忽略此選項。
master-port = 3306  #從屬服務器用來連接主控服務器的TCP/IP端口(默認設置是3306端口)。
master-connect-retry = 20  #如果與主控服務器的連接沒有成功,則等待n秒(s)后再進行管理方式(默認設置是60s)。如果從屬服務器存在mater.info文件,它將忽略此選項。
master-ssl-xxx = xxx  對主、從服務器之間的SSL通信進行配置。
read-only = 0  #0: 允許從屬服務器獨立地執行SQL命令(默認設置); 1: 從屬服務器只能執行來自主控服務器的SQL命令。
read-log-purge = 1  #1: 把處理完的SQL命令立刻從中繼日志文件里刪除(默認設置); 0: 不把處理完的SQL命令立刻從中繼日志文件里刪除。
#復制過濾參數
replicate-do-table = dbname.tablename  #只對表進行鏡像處理,但數據庫和數據庫表名字里允許出現通配符”%” (例如: test%.%–對名字以”test”開頭的所有數據庫里的所以數據庫表進行鏡像處理)。
replicate-do-db = dbname  #只對這個數據庫進行鏡像處理,多行進行逗號分隔或全部另起一行
replicate-ignore-db = dbname  #不對這個數據庫進行鏡像處理。
                   #如果從庫是要在線復制過濾,stop slave;然后按如下形式操作:     
                   #CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('erp_ivedeng_com.T_BRAND','erp_ivedeng_com.T_DEPARTMENT_FEE_ITEMS'); 
replicate-ignore-table = dbname.tablename  #忽略這個數據表進行復制處理。也可以 dbname.%,表示該庫下所有表
replicate_wild_do_table=table_name      #解決跨庫更新問題,需要與 replicate_do_table 同時使用,也可以 dbname.% 表示該庫下所有表
replicate-wild-ignore-table = dbname.tabname  #忽略跨庫更新表的復制,需要與 replicate-ignore-db 同時使用,也可以dbname.% 表示該庫下所有表
replicate-rewrite-db = db1name > db2name  #把主控數據庫上的db1name數據庫鏡像處理為從屬服務器上的db2name數據庫。每個另起一行
  #m230渠道
    #replicate-wild-do-table=m230:x_uat.%
    #replicate-wild-do-table=m230:x_uat_read.%
    #replicate-wild-do-table=m230:perf_db.% 

report-host = hostname  #從屬服務器的主機名; 這項信息只與SHOW SLAVE HOSTS命令有關–主控服務器可以用這條命令生成一份從屬服務器的名單。
slave-compressed-protocol = 1  #主、從服務器使用壓縮格式進行通信–如果它們都支持這么做的話。
slave-skip-errors = n1, n2, …或all  #即使發生出錯代碼為n1、n2等的錯誤,鏡像處理工作也繼續進行(即不管發生什么錯誤,鏡像處理工作也繼續進行)。
                      #如果配置得當,從屬服務器不應該在執行 SQL命令時發生錯誤(在主控服務器上執行出錯的SQL命令不會被發送到從屬服務器上做鏡像處理);
                      #如果不使用slave-skip-errors選項,從屬服務器上的鏡像工作就可能因為發生錯誤而中斷,中斷后需要有人工參與才能繼續進行。(注意,gtid無法使用

#半同步復制
plugin_dir=/mysql/app/mysql/lib/plugin/ plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so #如果是5.7,參數前面加上loose_,如下列,如果是5.6 則直接使用 rpl_semi_sync_master_enabled=1 之類的就好了。 #我這里是5.7就直接做增強半同步了(loseless Semisynchronous ) loose_rpl_semi_sync_master_enabled=1 #MySQL開啟主的半同步復制(rpl_semi_sync_master_enabled) loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6開啟從的半同步復制 loose_rpl_semi_sync_master_timeout=5000 #超時5秒,切回異步
  #mysql配置插件相關的參數 只能在插件加載之后設置,如果想啟動時設置這些參數並且啟動后加載插件到配置文件中,可以在參數前加上“loose-”前綴。 rpl_semi_sync_master_wait_for_slave_count=1 #有多少個從返回標識就可以提交:案例:一主多從的情況下只要有1個slave的ACK返回給了主庫,就會進行commit rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增強半同步) & AFTER_COMMIT(傳統半同步)

#GTID 復制
gtid_mode=1  #開啟GTID
enforce_gtid_consistency=1 #on:當發現語句/事務不支持GTID時,返回錯誤信息  WARN:發現不支持返回警告  #off:不檢查
log-slave-updates=1 #從庫relay log中的重做記錄在從庫的binlog上記錄,如果多個從庫在主從切換時建議關掉,避免傳輸重復日志導致同步錯誤

#並行復制

slave-parallel-type=LOGICAL_CLOCK #LOGICAL_CLOCK:基於組提交的並行復制方式;DATABASE:兼容MySQL5.6基於 schema級別的並發復制
slave-parallel-workers=4 #4個SQL線程
slave_skip_errors=ddl_exist_errors #跳過DDL錯誤
slave_preserve_commit_order=1 #Slave 上 commit的順序保持一致,必須為1,否則可能會有GAP鎖產生

 

【1.1】常規生產my.cnf(5.7)

[client]
    user=david
    password=88888888

[mysqld]

########basic settings########

server-id = 11 
port = 3306
user = mysql
bind_address = 10.166.224.32
autocommit = 0
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /data/mysql_data
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
    
########log settings########

log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100
    
########replication settings########

master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row 
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors

########innodb settings########

innodb_page_size = 8192
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /redolog/
innodb_undo_directory = /undolog/
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G  #undolog/
innodb_log_buffer_size = 16777216
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864 

########semi sync replication settings########

plugin_dir=/usr/local/mysql/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

 

【1.2】常規生產mysql5.6

[client]
port            = 3306
socket            = /var/lib/mysql/mysql.sock
[mysqld]
socket            = /var/lib/mysql/mysql.sock
port            = 3306
tmpdir                      = /tmp/tmpmysql
#character set,5.6version set utf8
character_set_server=utf8
init_connect='set names utf8'
skip-character-set-client-handshake=1
#deafault engine
default_storage_engine  = InnoDB
#log info
slow_query_log        = 1
slow_query_log_file     = /data/mysqllog/slowlog/slowquery.log
long_query_time       = 2
log-error          = /data/mysqllog/errorlog/log-error.log
skip-external-locking
log_warnings
back_log = 300
# fine tuning
skip-name-resolve
max_connections       = 5000
max_allowed_packet       = 32M
max_heap_table_size     = 128M
key_buffer_size       = 128M
sort_buffer_size       = 16M
join_buffer_size       = 16M
net_buffer_length      = 8K
read_buffer_size       = 128M
read_rnd_buffer_size     = 128M
myisam_sort_buffer_size     = 8M
thread_cache_size      = 16
#thread_concurrency     = 24
table_open_cache       = 4096
#mysql 5.6 new feature
explicit_defaults_for_timestamp=true
# * Query Cache Configuration
query_cache_limit       = 4M
query_cache_size       = 4096M
query_cache_type       = 1
tmp_table_size        = 128M
#innodb settings
innodb_data_home_dir         = /data/idbdata
innodb_log_group_home_dir    = /data/idbdata/
innodb_data_file_path        = ibdata1:100M:autoextend
innodb_fast_shutdown         = 1
innodb_file_per_table      = 1
innodb_file_io_threads      = 4
innodb_open_files       = 2048
innodb_buffer_pool_size      = 10G  
#innodb_additional_mem_pool_size = 16M
innodb_thread_concurrency    = 16
innodb_max_dirty_pages_pct   = 90
innodb_log_buffer_size       = 8M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method       = 0_DIRECT
innodb_lock_wait_timeout     = 10
innodb_log_files_in_group   = 2
innodb_log_file_size     = 64M
innodb_flush_log_at_trx_commit= 0
innodb_autoextend_increment  = 256
innodb_buffer_pool_instances = 12
innodb_concurrency_tickets  = 5000
innodb_old_blocks_time    = 1000
innodb_lock_wait_timeout   = 50
#log-bin settings
log-bin            = /data/mysqllog/binlog/master-bin.log
expire_logs_days       = 5
binlog_cache_size       = 1M
max_binlog_size        = 10M
[mysqldump]
# Do not buffer the whole result set in memory before writing it to
# file. Required for dumping very large tables
quick
#quote-names
max_allowed_packet      = 64M
max_connect_errors      =1000
[mysql]
no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout

 【1.3】跳過某些參數啟動

(1)關閉從庫啟動:mysqld_safe --skip-slave-start &

(2)跳過權限表:mysqld_safe --skip-grant-tables &

 

 【1.4】生產5.7配置文件參考

#for  innodb                                                          
#edited by   2011-03-23
 
[client]
port        = 3306
#socket     =/data/mysqldata/sock/mysql.sock2433
socket      = /tmp/mysql.sock
#default-character-set=utf8
 
[mysqld]
user        = mysql
bind-address= 10.10.4.180
port        = 3306
socket      = /data/mysqldata/sock/mysql.sock2433
lower_case_table_names = 1
datadir=/data/mysqldata/data/2433/
pid-file= /data/mysqldata/var/2433.pid
 
tmpdir=/data/mysqllog/2433/tmpdir 
 
#add mysql 5.6
innodb_print_all_deadlocks = 1
 
skip-external-locking
skip-name-resolve
 
key_buffer_size  = 64M  
 
max_allowed_packet = 16M
table_open_cache = 2048   
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache_size = 12
query_cache_size = 32M
#thread_concurrency = 8
max_binlog_size = 20M
 
wait_timeout=86400
interactive_timeout=86400
 

max_connections = 5000
max_connect_errors = 99999
event-scheduler = on

slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysqllog/2433/slow-query.log 
 
expire_logs_days = 30
log_bin = /data/mysqllog/binlog/2433/binlog.bin
log_bin_trust_function_creators=1
binlog_format = MIXED
 
#mysql 5.6
gtid-mode=on
enforce-gtid-consistency
log-slave-updates
 
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
 
relay-log = /data/mysqldata/data/2433/relay.bin
 
log-bin-trust-function-creators=1
 
server-id = 17421 
 innodb_file_per_table = 1
 
#
innodb_data_home_dir      = /data/mysqldata/innodb/data/2433
innodb_data_file_path     = ibdata1:1G:autoextend
innodb_log_group_home_dir = /data/mysqldata/innodb/log/2433
 
 
innodb_buffer_pool_size = 4000M
innodb_additional_mem_pool_size = 20M
innodb_buffer_pool_instances=3
 
innodb_log_file_size       = 256M  
innodb_log_buffer_size     = 32M
#innodb_mirrored_log_groups = 1
innodb_log_files_in_group  = 4     
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 8
innodb_file_io_threads=4
sql_mode=""                                                        
[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
prompt=\U|\d>
 
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
 
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
 
[mysqlhotcopy]
interactive-timeout

 

 

【2】相關原理

【2.1】mysql中的WAL 從內存日志到磁盤日志的出發機制 

# log buffer => log file 觸發機制
#(1)強制每1s寫一次。
#(2)大於log buffer空間1/2的時候
#(3)commit的時候
#(4)log buffer寫到1M的時候
#(5)日志先寫機制,后台的臟頁寫磁盤之前,就先把日志寫過來。

【2.2】flush disk 存盤二進制日志信息的流程

寫binlog流程如下:
# 數據操作buffer pool > binlog buffer > file system buffer > commit > binlog file
在寫binlog file之前,commit有3種模式,分別是:0,1,N
sync_binlog=0:mysql不會主動同步Binlog內容到磁盤文件中,而是依賴操作系統刷新文件的機會刷binlog file.一般是1S/次
sync_binlog=1:默認值,mysql主動刷新file system buffer到磁盤上的binlog file中,每1次commit,就主動fsync一次。
sync_binlog=N:非0非1,mysql主動刷新file system buffer到磁盤上的binlog file中,每N次commit,就主動fsync一次。

【2.3】先寫redo還是先寫binlog?

 

圖一 二階段提交

1)Storage Engine(InnoDB) transaction prepare階段:即sql語句已經成功執行並生成xid信息以及redo和undo的內存日志

2)Binary log日志提提交

2.1)  write()將binary log內存日志數據寫入文件系統緩存

2.2)  fsync()將binary log 文件系統緩存日志數據永久寫入磁盤

3)Storage Engine(InnoDB)內部提交

commit階段在存儲引擎內提交( innodb_flush_log_at_trx_commit控制)使undo和redo永久寫入磁盤

處理

一旦步驟2中的操作完成,就確保了事務的提交,即使在執行步驟3時數據庫發送了宕機。

即binlog落盤成功,就算redo未落盤成功,那么事務也算是提交成功了.

binlog落盤條件:參數sync_binlog: 0每秒落盤,1每次commit落盤  n 每n個事物落盤

此外需要注意的是,每個步驟都需要進行一次fsync操作才能保證上下兩層數據的一致性。步驟2的fsync參數由sync_binlog控制,步驟1的fsync由參數innodb_flush_log_at_trx_commit控制。(雙1配置)

兩階段提交:先寫redo-buffer再寫binlog 並落盤最后落盤redo-buffer.

最終:mysql在落盤日志的時候,先落盤binlog,再落盤redo.

 
         

 開啟Binary log的MySQL在crash recovery時:

 
         
  • 當事務在prepare階段crash,數據庫recovery的時候該事務未寫入Binary log並且存儲引擎未提交,將該事務roll back
  • 當事務在Binary log日志已經fsync()永久寫入二進制日志時crash,但是存儲引擎未來得及commit.
  • 此時MySQL數據庫recovery的時候將會從二進制日志的Xid(MySQL數據庫內部分布式事務XA)中獲取提交的信息重新將該事務重做並commit使存儲引擎和二進制日志始終保持一致。

先寫redo LOG,再寫binlog。如果2個有任一失敗,就會回滾。 sync_binlog配合另一個參數innodb_flush_log_at_trx_commit; 如果都是1,數據庫掛了以后,最多只丟一條一句或一個事務的數據; show variables like
'innodb_flush_log_at_trx_commit'; 但會影響性能,只能說在數據要求非常高的場景下使用。


 深入研究參考:http://blog.itpub.net/28218939/viewspace-1975809/

【2.4】mysql行格式

Mysql 目前有4種行格式:Redundant、Compact、Dynamic、Compressed

Version 5.6 已經默認使用 Compact

Version 5.7 默認使用Dynamic

Redundant 是比較老的數據格式,Compressed 不能應用在System data;所以Compact和Dynamic應用較廣泛;

規定(只討論InnoDB)

  1、存儲單元為頁(page),16KB(16384B)

  2、每頁至少需要存兩條數據

  3、每條記錄都會有記錄頭

  4、記錄幾乎都會有3個隱藏列(rowId,transactionId,rollPointer)

Compact:

變長字段(記錄的長度)列表  +  NULL列表  + 記錄頭信息  + 列值

  變長字段(記錄的長度)列表:

    采用1-2個字節來表示一個字段的長度,逆序;

    字段最大長度<= 255字節用1個字節表示;大於255字節,但是實際使用字節<=127,也使用1個字節來表示;其他情況使用2個字節來表示;

    char如果是變長字符集(GBK、UTF8)也會需要使用變長字段列表來存儲字段使用的長度;

  NULL列表:

    逆序,存儲每條記錄中允許為NULL的字段,將實際為NULL的字段用1表示,實際不為NULL的字段用0表示;

    每一列不是用一個字節來表示,而是用一個位來表示;

  記錄頭信息:

    使用5個字節來表示;

    主要包含:該記錄是否被刪除,記錄類型,下一條記錄的相對偏移量;

Redundant:

  字段長度偏移列表 + 記錄頭 + 列值

    字段長度偏移列表,用來記錄每列的結束位置;

    真實數據(整條記錄)<=127B 用1個字節記錄,其他使用2個字節;

    是使用1個字節還是2個字節來存儲,該信息放在記錄頭的(1byte_offs_flag屬性上)  

    每個列記錄的第一個bit 使用來表示該列是否位NULL;

Dynamic:

  與Compact行格式很像,差異在於頁面溢出的處理上;

Compressed:

  在於Dynamic使用了壓縮算法;

頁溢出:

  因為每頁16KB,至少存儲兩行,所以每行大概有8KB的數據;拋開記錄頭信息等,大致每列超過768B就會產生頁溢出;

  Compact:

    1、會將溢出的數據單獨放入一個頁;外加20B存儲額外頁的信息(plus the 20-byte pointer to the externally stored part)

    2、索引可以使用前768B

  Dynamic:

    2、如果頁溢出,則使用20B存儲整個列信息(列數據都存儲在溢出頁上)(with the clustered index record containing only a 20-byte pointer to the overflow page)

    3、可以使用前3072B字符的索引(--innodb-large-prefix決定)

總的說來,Redundant使用更多的字節數量來存儲一條記錄(字段長度偏移列表),頁溢出會使用更多的20B來表示溢出部分(或整列)數據,會使得索引數據更大;

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM