目錄:
1 配置說明
2 my.cnf修改
3 命令說明
---------------------------------------------------------------------1 配置
my.cnf #find 查找my.cnf /etc/my.cnf
data目錄 1 查看my.cnf搜索datadir
2 phpinfo搜索MYSQL_SOCKET /var/lib/mysql/
------------------mysql 日志 通常, MySQL 的日志是放在它的數據庫目錄下。
mysql有以下幾種日志:
錯誤日志: log-err
查詢日志: log
慢查詢日志: log-slow-queries
更新日志: log-update
二進制日志: log-bin
要把日志生成在 /var/log 目錄下(是系統日志存放的地方,只有 root 賬號有寫權限),需要 MySQL 進程對這個目錄有讀寫權限,一般是不這么做的,也考慮到安全問題,包括 MySQL 本身的數據安全,因為對 MySQL 的所有操作,都會記錄到常規查詢日志。MySQL 的日志就不要用 /var/log/ 目錄下。
---------------------------------------------------------------------2 my.cnf
http://blog.sina.com.cn/s/blog_417b97470100mvnj.html Mysql性能調優
[client]
default-character-set = utf8
port = 3306
socket = /tmp/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
#default-character-set = utf8
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /data0/mysql/3306/data
open_files_limit = 10240
back_log = 600
max_connections = 3000 實際MySQL服務器允許的最大連接數16384;
max_connect_errors = 6000 可以允許多少個錯誤連接
table_cache = 1024 高速緩存的大小.table_cache的值在2G內存以下的機器中的值默認時256到 512,如果機器有4G內存,則默認這個值是2048,但這決意味着機器內存越大,這個值應該越大,因為table_cache加大后,使得mysql對 SQL響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得數據庫整個一套操作慢了下來,嚴重影響性能。
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 2M 是一個connection級參數,在每個connection第一次需要使用這個buffer的時候,一次性分配設置的內存.並不是越大越好,由於是connection級的參數,過大的設置+高並發可能會耗盡系統內存資源。
join_buffer_size = 2M
thread_cache_size = 64 重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創建,如果有很多新的線程,增加這個值可以改善系統性能
根據物理內存設置規則如下:
1G ---> 8
2G ---> 16
3G ---> 32
>3G ---> 64
thread_concurrency = 16 對mysql的性能影響很大, 在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工作的情況。
應設為CPU核數的2倍. 比如有一個雙核的CPU, 那么thread_concurrency的應該為4; 2個雙核的cpu, thread_concurrency的值應為8.
query_cache_size = 32M 緩存機制簡單的說就是緩存sql文本及查詢結果,如果運行相同的sql,服務器直接從緩存中取到結果,而不需要再去解析和執行sql。如果表更改了,那么使用這個表的所有緩沖查詢將不再有效,查詢緩存值的相關條目被清空
query_cache_limit = 2M 單個查詢能夠使用的緩沖區大小.缺省為1M
query_cache_min_res_unit = 2k 它指定分配緩沖區空間的最小單位,缺省為4K。檢查狀態值Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多,這就表明查詢結果都比較小,此時需要減小query_cache_min_res_unit
default-storage-engine = MyISAM
default_table_type = MyISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED 設置所有連接的默認事務隔離級
tmp_table_size = 256M 臨時HEAP數據表的最大長度
max_heap_table_size = 256M HEAP數據表(內存表)的最大長度(默認設置是16M);
long_query_time = 1
log_long_format
log-bin = /data0/mysql/3306/binlog
binlog_cache_size = 8M 為binary log指定在查詢請求處理過程中SQL 查詢語句使用的緩存大小
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 256M 索引緩沖區的大小,嚴格說是它決定了數據庫索引處理的速度,尤其 是索引讀的速度
read_buffer_size = 1M 讀查詢操作所能使用的緩沖區大小,該參數對應的分配內存也是每連接獨享.
read_rnd_buffer_size = 16M 針對按某種特定順序(如ORDER BY子句)輸出的查詢結果(默認256K) 加速排序操作后的讀數據,提高讀分類行的速度。
bulk_insert_buffer_size = 64M 指定 MyISAM 類型數據表表使用特殊的樹形結構的緩存
myisam_sort_buffer_size = 128M myisam引擎的sort_buffer_size
myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G 這個參數已經不在MySQL
myisam_repair_threads = 1
myisam_recover 自動檢查和修復無法正確關閉MyISAM表
skip-name-resolve
master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
server-id = 1 設定為master
innodb_additional_mem_pool_size = 16M InnoDB用來存儲數據字典和其他內部數據結構的內存池大小。
應用程序里的表越多就應該分配越多的內存,如果innodb用光了這個內存就會向系統內存要。
並且寫入警告日志,根據MySQL手冊,對於2G內存的機器,推薦值是20M。
缺省值是1M。通常不用太大,只要夠用就行,與表結構的復雜度有關系。
innodb_status_file
InnoDB發送診斷輸出到stderr或文件,而不是到stdout或者固定尺寸內存緩沖,以避免底層緩沖溢出。作為一個副效果,SHOW INNODB STATUS 的輸出每15秒鍾寫到一個狀態文件。這個文件的名字是innodb_status.pid,其中pid是服務器進程ID。這個文件在MySQL數據目錄里創建。正常關機之時,InnoDB刪除這個文件。如果發生不正常的關機,這些狀態文件的實例可能被展示,而且必須被手動刪除。在移除它們之前,你可能想要檢查它們來看它們是否包含有關不正常關機的原因的有用信息。僅在配置選項innodb_status_file=1被設置之時,innodb_status.pid文件被創建。
innodb_buffer_pool_size = 2048M 指定大小的內存來緩沖數據和索引。
對於單獨的MySQL數據庫服務器,最大可以把該值設置成物理內存的80%。
根據MySQL手冊,對於2G內存的機器,推薦值是1G(50%)
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4 IO操作(硬盤寫操作)的最大線程個數(默認設置是4)。
innodb_thread_concurrency = 16 InnoDB驅動程序能夠同時使用的最大線程個數(默認設置是8)。
innodb_flush_log_at_trx_commit = 2 InnoDB記錄日志的方式
如果設置為1,則每個事務提交的時候,MySQL都會將事務日志寫入磁盤。
如果設置為0或者2,則大概每秒中將日志寫入磁盤一次。
實際測試發現,該值對插入數據的速度影響非常大
設置為2時插入10000條記錄只需要2秒,設置為0時只需要1秒,而設置為1時則需要229秒。
建議盡量將插入操作合並成一個事務,這樣可以大幅提高速度。
在存在丟失最近部分事務的危險的前提下,可以把該值設為0。
innodb_log_buffer_size = 16M 日志緩存的大小
默認的設置在中等強度寫入負載以及較短事務的情況下,一般可以滿足服務器的性能要求。
如果更新操作峰值或者負載較大就應該加大這個值。8-16M即可。
innodb_log_file_size = 128M 日志組中每個日志文件的大小在高寫入負載尤其是大數據集的情況下很重要。
這個值越大性能就越高,但恢復時時間會加長。默認是5M。Javaeye推薦innodb_log_file_size = 64M
innodb_log_files_in_group = 3 日志組中的日志文件數目,推薦使用3
innodb_max_dirty_pages_pct = 90 最大臟頁的百分數
innodb_lock_wait_timeout = 120 事務獲得資源超時設置,默認50s
innodb_file_per_table = 0 為每一個新數據表創建一個表空間文件而不是把數據表都集中保存在中央表空間里
[mysqldump]
quick 不緩沖查詢,直接導出至stdout
max_allowed_packet = 32M
停用mysql的嚴格驗證STRICT_TRANS_TABLES
#把sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 中"STRICT_TRANS_TABLES,"去掉,重啟MySQL服務,問題解決……汗顏~~~
#開啟event
#event_scheduler = on
#myisam自動修復
myisam-recover=BACKUP,FORCE
# 在[mysqld] 中輸入
log-bin=/var/lib/mysql/mysql-bin
#expire_logs_days = 10
#max_binlog_size = 100M
log=/var/lib/mysql/mysql.log
log-error=/var/lib/mysql/error.log
#log-update=/var/lib/mysql/update.log 未能成功生成
long_query_time=1
log-slow-queries
log-queries-not-using-indexes
是否啟用了日志
mysql>show variables like 'log_%';
怎樣知道當前的日志
mysql> show master status;
顯示二進制日志數目
mysql> show master logs;
看二進制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail
#詳細說明
log-bin=/var/lib/mysql/mysql-bin #二進制LOG,mysqlbinlog直接讀取二進制日志文件。二進制日志包含所有更新數據的語句 ,其目的是在恢復數據庫時用它來把數據盡可能恢復到最后的狀態。另外,如果做同步復制( Replication )的話,也需要使用二進制日志傳送修改情況。log_bin指定日志文件,如果不提供文件名,MySQL將自己產生缺省文件名。MySQL會在文件名后面自動添加數字索引,每次啟動服務時,都會重新生成一個新的二進制文件。
時間長了log bin也會占很大的硬盤空間,所以在my.ini中加上對其的限制。
#expire_logs_days = 10
#max_binlog_size = 100M
---------------------
# show master status;
#mysqlbinlog mysql-bin.000052
-------------格式如下:
flush privileges
/*!*/;
# at 173
#090814 10:09:22 server id 1 end_log_pos 448 Query thread_id=51 exec_tim e=0 error_code=0
use sq_gllutf8/*!*/;
SET TIMESTAMP=1250215762/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@sessio n.collation_server=8/*!*/;
update gll_products set sn_name='休閑褲' ,ch_name='H957-3' ,color='卡其' ,co mposition='60%馬棉44' ,huoqi='' ,p_remarks='' ,utime='2009-08-14 10:09:22' , uip='192.168.200.96' WHERE id = '339'
/*!*/;
# at 448
#090814 10:11:14 server id 1 end_log_pos 556 Query thread_id=59 exec_tim e=0 error_code=0
SET TIMESTAMP=1250215874/*!*/;
delete from gll_member WHERE id = '26'
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
-----------------------------------
log=/var/lib/mysql/mysql.log #對所有執行語句進行記錄
----------------------------格式如下:
090814 10:11:14 59 Connect sq_szczkj@localhost on
59 Init DB sq_gllutf8
59 Query SET NAMES 'UTF8'
59 Query delete from gll_member WHERE id = '26'
59 Quit
090814 10:11:15 60 Connect sq_szczkj@localhost on
60 Init DB sq_gllutf8
60 Query SET NAMES 'UTF8'
60 Query select * from gll_member ORDER BY id DESC
60 Query select * from gll_member ORDER BY id DESC limit 0,50
60 Quit
61 Connect sq_szczkj@localhost on
61 Init DB sq_gllutf8
61 Query SET NAMES 'UTF8'
61 Query select * from gll_zone ORDER BY id DESC
61 Query select * from gll_zone ORDER BY id DESC limit 0,99
61 Quit
---------------------------------
log-error=/var/lib/mysql/error.log
#log-update=/var/lib/mysql/update.log 未能成功生成
long_query_time=1
log-slow-queries
#--log-slow-queries[=
的file_name參數可選,缺省值是file_name
]
,如果指定了file_name參數的話,mysql就會把慢查詢的日志記錄到file_name所設定的文件中,如果file_name提供的是一個相對路徑,mysql會把日志記錄到mysql的data目錄中。host_name
-slow.log
log-queries-not-using-indexes #在mysql的啟動配置文件或命令行參數中增加--log-queries-not-using-indexes
參數就可以啟用未使用索引查詢語句了,日志記錄的文件就是log-slow-queries對應的文件。
----------------Mysql的log_slow_queries日志文件設置不當錯誤
log_slow_queries = ON
log_slow_queries=/var/log/slow-queries.log
long_query_time=5
這種容易導致slow-queries.log無法讀取的錯誤(權限問題)。
常見錯誤提示:
[ERROR] Could not use /var/log/slow-queries.log for
logging (error 13). Turning logging off for the whole duration of the
MySQL server process. To turn it on again: fix the cause, shutdown the
MySQL server and restart it.
2,比較妥當的配置:
log_slow_queries = ON
log_slow_queries=slow-log
long_query_time=5
直接在目錄/var/lib/mysql/ 下生成 slow-log 文件
----------------------------測試慢日志
mysql>select sleep(1);
mysql>select sleep(3);
mysql>select * from gll_products;
打開mysql.log和慢日志文件可以看到
select sleep(3);
select * from gll_products;
---------------------------------------------------------------------3 命令說明
show variables like 'long%'; 查詢 long_query_time 的值
mysql>show variables like 'log_%'; 是否啟用了日志
mysql> show variables like 'log_%';
+---------------------------------+--------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /var/lib/mysql/error.log |
| log_queries_not_using_indexes | ON |
| log_slave_updates | OFF |
| log_slow_queries | ON |
| log_warnings | 1 |
+---------------------------------+--------------------------+
mysql> show master logs; 顯示二進制日志數目
mysql>show variables like 'log_bin'; 確認你日志是否啟用
mysql> show master status; 怎樣知道當前的二進制日志
查看從某一段時間到某一段時間的二進制日志
mysqlbinlog --start-datetime='2008-01-19 00:00:00' --stop-datetime='2008-01-30 00:00:00' /var/lib/mysql/mysql-bin.000006 > mysqllog1.log
shell>mysqlbinlog mail-bin.000001 看二進制日志文件用mysqlbinlog
或者shell>mysqlbinlog mail-bin.000001 | tail
flush privileges; 刷新數據庫
mysql> SHOW STATUS; 運行下列命令可以獲取狀態變量的值:
mysql> SHOW STATUS LIKE ‘[匹配模式]’; ( 可以使用%、?等 ) 如果只要檢查某幾個狀態變量,可以使用下列命令:
select version(); 查看mysql版本