2017年3月15日 星期三

mysqy dump

chown [-R] 帳號名稱:群組名稱 檔案或目錄
sudo chown -R mysqld:mysqld /output/dir
mysqldump -u dbuser -pxxx --tab=/var/lib/mysql-files Urdbname

--secure-file-priv default @at  /var/lib/mysql-files

mysqlimport [options] db_name textfile1 [textfile2 ...]
mysqlimport -u dbuser -pxxx  Urdbname  textfile1 [textfile2 ...]

–ignore 忽略索引鍵重複的匯入資料
–replace 索引鍵重複時,以匯入的資料更新資料庫中的資料
–local 指定匯入的資料檔案來源為用戶端

******************************************
Import folder of .sql files into a single database

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch -u root -p db_name

mysqlimport -u [username] -p [database] `pwd`/*.txt

***********************************************
Take a mysqldump with each database in its own SQL File
mysql -u username -p -N -e 'show databases' | while read dbname; do mysqldump -u username -pPassword --complete-insert --routines --triggers --single-transaction
 "$dbname" > "$dbname".sql; done

MySQL dump db 的 schema
參數: --no-data, -d

MySQL  dump db 的 data
參數:
-c: SQL 語法前面會把欄位名稱也列出來
-t: Table

如何看 mysql bin log
mysqlbinlog m10-relay-bin.001

如何看 SQL 語法使用到哪個 Index Key
mysql> EXPLAIN SELECT * FROM User

如何設定把 所有 對此 MySQL 所下的 SQL 語法都記錄下來
my.cnf
[mysqld]
log = /var/logs/mysql/mysql-query.log

如何找出 MySQL column欄位中的值不等於 0-9 的
SELECT * FROM TABLENAME WHERE column REGEXP '[^0-9]';

要將資料倒回 DB 的標準做法(若有設 Foreign Key 用此方法才能順利匯入)
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> SOURCE dump_file_name;
mysql> SET FOREIGN_KEY_CHECKS = 1;
----------------------------------------------------------------
Do not do this, since it might screw up encoding:
mysql -u username -p database < dump_file # this is bad
Better do:

mysql -uroot -p --default-character-set=utf8 database
mysql> SET names 'utf8'
mysql> SOURCE utf8.dump
------------------------------------------------------

MySQL innoDB 縮減空間大小

http://xyz.cinc.biz/2014/10/mysql-innodb-reclaim-free-space.html

2017年3月4日 星期六

innodb setup

※檢查mysqld.log
InnoDB: ERROR: the age of the last checkpoint is .........
innodb_log_file_size 設定越大效率越高,但當資料庫crash時恢復更慢,一般用64M-512M
Innodb_log_buffer_size 經常更新或使用很多blob數據,應調高此值,8M-16M一般應該夠了。

※確認ib_logfile0和ib_logfile1大小(mysql 資料夾下)
[mysqld] 
 innodb_log_file_size=512MB (64MB)
 innodb_log_buffer_size=16MB (4MB)

MySQL innodb檔案成長過大解決辦法
http://mark329329.pixnet.net/blog/post/203721058-mysql-innodb%E6%AA%94%E6%A1%88%E6%88%90%E9%95%B7%E9%81%8E%E5%A4%A7%E8%A7%A3%E6%B1%BA%E8%BE%A6%E6%B3%95

※設定innodb_flush_log_at_trx_commit
[mysqld]
innodb_flush_log_at_trx_commit=0 
  
0:(效率最好,安全性差)日誌緩衝區每秒一次都會將log寫到日誌檔案,並且將硬碟裡的日誌檔案做更新儲存,但是在commit動作下不做任何操作。
1:在每次commit動作時,日誌緩衝區的資料被寫到日誌檔裡,且對日誌檔案更新至硬碟中。(預設值)
2:在每次commit時,日誌緩衝區被寫到日誌檔案,但不對日誌檔案更新至硬碟中

innodb_buffer_pool_size
如果只用Innodb,可以把這個值設為內存的70%-80%。和 key_buffer相同,如果數據量比較小也不怎麼增加,那麼不要把這個值設太高也可以提高內存的使用率。

※ innodb_change_buffering 參數來設定需要進 Cache Buffer 的動作,預設是全部 (all) 變更都會進行 Cache。文件提到有 none, inserts, deletes, changes, purges, all 這些設定,可以依據你的業務需求調整。

※innodb_adaptive_hash_index = ON
MySQL自動替索引建立加速走訪的 Hash 索引,可以提高索引 Insert 與 Search 的速度 (Multiple Concurrent Joins),透過 SHOW ENGINE INNODB STATUS 命令觀察 AHI 的運作狀態,來決定開或關。

※thread_concurrency = 12
網路都建議設為 CPU 核心數的兩倍!? 但其實不要超過核心數比較適合

※innodb_read_ahead_threshold 
透過 SHOW ENGINE INNODB STATUS 可以觀察 Pages 被預載讀取的次數,過高的次數可能會浪費 Disk I/O 而吃掉了性能。可以觀察以下兩的統計值來調整適合的策略:
Innodb_buffer_pool_read_ahead 表示預載進入 Buffer Pool 的 Pages 數量
Innodb_buffer_pool_read_ahead_evicted 表示進到 Buffer Pool 後沒有被使用之後被踢出 Buffer Pool 的 Pages 數

※innodb_io_capacity = 200
InnoDB Master Thread 會將 Buffer Pool 中的資料 (Dirty Pages) 寫回 Disk, innodb_io_capacity 這個參數定義了系統每秒可以處理的 Disk I/O 數量,用意是避免這個機制佔用了太多 Disk I/O 而影響到真正執行 Query 需要的資源。這個算是不容易調整的參數,如果您的 MySQL 伺服器是使用 SSD 那麼建議可以把這個值調高一些,讓 Buffer Pool 背景處理可以更快速。

※innodb_max_dirty_pages_pct (預設 75) 
當 Buffer Pool 中的 Page 有發生變更時,就會變成 Dirty Page,MySQL 會在適當的時機由 Master Thread 將 Dirty Page 刷新到 Disk Page 中,但也不是持續回寫全部的 Dirty Page,我們可以透過調整 innodb_max_dirty_pages_pct來控制 Dirty Pages 存在 Buffer Pool 中的比例,比較明顯的就是關閉 MySQL 時,這些 Buffer Pool 中 Dirty Page 會一次回寫到 Disk

※innodb_spin_wait_delay = 6
Spin 是一種「鎖」運作機制,當其中一個 Thread 取得鎖,其他的 Thread 必須等待 (Sleep) 一段時間,然後看看鎖是否被釋放,這個機制稱為 Spin Lock Polling。這個等待時間就是透過 innodb_spin_wait_delay 進行設定。比較短的 Spin Time 當然可以比較快讓其他 Thread 取得鎖,但是頻率過高會耗費多餘的 CPU 運算