寫這些的目的一是記錄下工做這幾年所學,算是成長腳印吧。二是複習一遍,也給本身當筆記看,通篇觀點都屬於我的理解較多。讀者觀看的時候也須要本身判斷下是否正確,另外,記下一段我很是喜歡的話:年少輕狂的我一樣有對將來的迷茫,對生活的憤懣,對社會的厭惡,對世道的鄙夷......在閱盡滄桑的飽覽歲月的人看來,這些也許很幼稚,但這不正是青春的特質嗎?青春既然不可以被挽留,也不可以被拒絕,那就用本身的方式去揮霍或者,珍惜。python
1、鏈接創建前mysql
一、鏈接方式sql
二、服務器、客戶端域名鏈接shell
三、重要參數數據庫
2、權限緩存
首先介紹鏈接方式,mysql能夠提供來自網絡的tcp/ip鏈接和只服務本機localhost的Unix域套接字鏈接,若是服務器不監聽來自網絡的鏈接,遠程客戶端鏈接會報錯,服務器不會收到任何消息。 Tcp/ip:用於跟mysql實例不在同一臺機器上的客戶端和本機127.0.0.1鏈接;注意防火牆的設置,防火牆是否放過mysql的進程,是否屏蔽了mysql的3306端口。 Unix域套接字:它不是一種網絡協議,只用於客戶端和mysql實例在同一臺機器上,用localhost訪問。 <1>skip_networking 告訴mysql不要監聽網絡,服務只限於本機localhost訪問,127.0.0.1也不能訪問。若是不須要其餘主機鏈接,最好把這變量打開,防止窮舉密碼攻擊。
<2> bind-address 只監聽某個特定地址的鏈接,這個參數是指定哪些服務器監聽哪些ip的請求,其餘ip就算有權限也鏈接不上。爲了數據的安全,能夠考慮讓MySQL只守候在127.0.0.1上,這樣從Internet上就沒法直接訪問數據庫了。
1)服務端 只要你安裝啓動了mysql服務,就能夠經過mysql服務器主機名稱或ip鏈接。可是客戶端給mysql服務器傳遞以前,主機名稱必定要轉換成ip,若是此主機名稱不是公共網絡上的主機名稱,必須在hosts表裏填寫主機名和其ip對應關係, 不然沒法鏈接。 Mysql服務器本機命令行客戶端:Shell>./mysql –hhost –uuser –ppwd 分別在C:\Windows\System32\drivers\etc\hosts和/etc/hosts中添加:ip hostname,而後分別從新鏈接,都可正常鏈接。 【1】resolveip工具 對hostname和ip的轉換工具。位於/usr/local/mysql/bin/。 2)客戶端域名鏈接受權 此域名對應mysql庫的user表中的host字段,是用來控制對客戶端的鏈接權限的。 mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', '', null);//域名受權 mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', '', null);//ip段受權,在此ip段的客戶端均可以經過hanmm這個帳號鏈接mysql服務。 or grant 權限 on 數據庫對象 to 用戶@'host' identified by 'pwd' Host cache 選項就能禁用主機緩存。想要清除主機緩存,能夠提交 FLUSH HOSTS 語句或者運行 mysqladmin flush-hosts. <1>skip-name-resolve skip-name-resolve能大大加快用戶得到鏈接的速度,特別是在網絡狀況較差的狀況下。MySQL在收到鏈接請求的時候,會根據請求包中得到的ip來反向追查請求者的主機名。而後再根據返回的主機名又一次去獲取ip。若是兩次得到的ip相同,那麼鏈接就成功創建了。在DNS不穩定或者局域網內主機過多的狀況下,一次成功的鏈接將會耗費不少沒必要要的時間。假如MySQL服務器的ip地址是廣域網的,最好不要設置skip-name-resolve。 When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the host cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname. 當一個新的鏈接請求產生,mysql會啓動一個新線程去處理此請求,該線程首先會檢查域名緩存裏是否有此域名,若是緩存裏不存在,則調用gethostbyaddr_r()和gethostbyname_r()處理此域名。 If the operating system doesn't support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready. 若是操做系統對這兩個函數不提供線程安全的調用(我理解是每一個線程隔離並行),則此線程對操做系統該資源加鎖,而後調用方法,直到它處理完釋放此資源鎖,別的線程才能調用。 You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables. 你能夠在啓動時加--skip-name-resolve這個參數,避免DNS host查找過程,這樣你使用ip地址而不能使用域名鏈接訪問mysql。 If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with --skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld. 若是DNS服務很慢且有不少域名,想要提升性能,你可選擇加參數--skip-name-resolve啓動,或者增大域名緩存空間大小。 容許域名解析的時候 localhost=127.0.0.1,禁止域名解析以後localhost與127.0.0.1並非同一個主機。因此在禁止域名解析以後,須要從新設置用戶權限,不能再使用 localhost ,使用 % 任意主機或者IP地址如127.0.0.1 。 You can disable the hostname cache with --skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts. If you don't want to allow connections over TCP/IP, you can do this by starting mysqld with --skip-networking. <2>host_cache_size 5.6.26默認279。The host_cache_size value, introduced in MySQL 5.6.5, is ignored by the server. The host_cache table only holds 128 entries. <3>skip-grant-tables 若是忘記管理員密碼,在啓動mysql時不啓動grant-tables受權表。mysqld_safe --skip-grant-tables & 而後修改管理員密碼: mysql>update user set password=password('yournewpasswordhere') where user='root'; mysql>flush privileges; mysql>exit; 重啓mysql。
<1>socket 默認值是/tmp/mysql.sock,此文件刪除掉會致使socket鏈接失敗。 Unix平臺:用於本地客戶端鏈接的套接字文件。默認爲/var/lib/mysql/mysql.sock。 Windows:用於本地客戶端鏈接的命名管道名。默認爲mysql。 <2>max_connections mysql是多線程的,能夠同時接收客戶端的多個鏈接(connection)請求。max_connections是整個mysql容許的最大併發鏈接數(實際值比該值多1,預留給系統管理員),影響整個mysql應用的併發處理能力。
只要服務器監聽了網絡tcp鏈接,無論用戶名密碼對不對,有沒有權限,客戶端發起鏈接請求,無論三七二十一,先檢查當前鏈接數是否已達到上限,達到鏈接上線拒絕鏈接。通常來講,只要mysql主機性能容許,應該將
該參數設置的儘可能大一點,通常1000-5000左右是一個比較合適的參考值。 <3>max_user_connections 每一個用戶容許的最大鏈接數。該參數針對單個用戶的鏈接限制。 在通常狀況下咱們不多使用這個限制,只有在一些專門提供mysql數據存儲服務或者提供虛擬主機的應用中可能用到。 <4>connect_timeout 鏈接超時 檢測方法 telnet ip 3306.鏈接超時時間,客戶端發送tcp第一次握手,我要請求了;服務器端收到請求,檢查鏈接未達到上限,返回贊成,計時開始;客戶端發送真正的(如select)請求,再到服務器端,
這段時間超過connet_timeout,就斷開了。默認值10,通常不要動。【在數據量大的狀況下,因爲網絡等緣由,若是connect_timeout設置太低,極有可能鏈接超時。這個值最低好像是2,許容許設置成0,設置成0其實就是
全部鏈接都鏈接不上了。】 權限1---鏈接權限認證: Usage,鏈接(登錄)權限。創建一個用戶,默認授予這個權限。該權限只能用於數據庫登錄,不能作任何操做。客戶端鏈接時,傳遞給服務器端的信息:客戶端的hostname或者IP地址、數據庫
服務器的IP地址或域名、數據庫服務的端口號、數據庫賬號名稱、數據庫賬號對應的密碼。服務器端檢查mysql庫的user表是否存在user和password對應用戶,host是否符合對應host,用戶是否有Usage權限。經過身份認證
鏈接才能創建,不然拒絕鏈接。客戶端鏈接成功後取得該連接的全部權限,在該鏈接生命週期內權限不會變,即便在別處更改了權限,也不會影響。例如:該用戶沒有delete權限,在鏈接後,管理員賦予它delete權限,但是得等
到此鏈接斷開,下一次鏈接成功後才能得到delete權限。 例如: 192.168.1.1服務器上安裝啓動mysql服務。 mysql> INSERT INTO `user` VALUES ('192.168.1.1', 'user', password("pwd"), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', '', null); User表裏host字段是鏈接客戶端的ip,和mysql服務器主機ip沒有關係,爲哪一個客戶端賦鏈接權限,就是哪一個客戶端主機的ip。 <5>Aborted_connects 用戶名密碼不對或沒權限或鏈接超時(connect_timeout),被丟棄的鏈接數。 <6>max_connect_errors 最大鏈接失敗數,max_connect_errors默認值爲10,若是受信賬號錯誤鏈接次數達到10則自動堵塞,須要flush hosts來解除。若是你獲得象這樣的一個錯誤: Host ’hostname’ is blocked because of many connection errors. Unblock with ’mysqladmin flush-hosts’ 在max_connect_errors次失敗請求後,mysqld認定出錯了(像來自一個黑客的攻擊),而且阻止該站點進一步的鏈接,直到某人執行命令mysqladmin flush-hosts或者有reload權限的用戶登陸後,執行mysql>flush hosts。 mysql認爲是惡意鏈接,會強制阻止此客戶端鏈接。當此客戶端有一次鏈接成功後,針對此客戶端的max_connect_errors會清零。---這個參數沒驗證出來。 <7>thread_stack 每一個鏈接線程被建立的時候,MySQL 給他分配的內存大小。 當 MySQL 建立一個新的鏈接線程的時候,是須要給他分配必定大小的內存堆棧空間,以便存放 客戶端的請求 Query 以及自身的各類狀態和處理信息。不過通常來講若是不是對 MySQL 的鏈接線 程處理機制十分熟悉的話,不該該輕易調整該參數的大小,使用系統的默認值(192KB)基本上 能夠全部的普通應用環境。若是該值設置過小,會影響 MySQL 鏈接線程可以處理客戶端請求的 Query 內容的大小,以及用戶建立的 Procedures 和 Functions 等 <8>back_log 短期內獲得大量鏈接請求,而且超過max_connections,mysql暫時中止回答新請求以前, 容許被存在堆棧中的請求數量。操做系統的TCP/ip鏈接的偵聽隊列大小對這個隊列大小有限制, 高於操做系統限制是無效的。
1、Usage權限 鏈接登錄。新增的用戶默認賦予這個權限,且此usage權限不能被收回。
2、管理grant權限 擁有grant option,就能夠將本身擁有的權限授予其餘用戶(僅限於本身已經擁有的權限) mysql> grant Grant option on db.* to db@localhost; mysql> grant select on db.* to db@localhost; mysql>grant select *.* to ‘user’@’192.168.1.%’ identified by ‘pwd’;
3、管理權限process 經過這個權限,用戶能夠執行SHOW PROCESSLIST和KILL命令。默認狀況下,每一個用戶均可以執行SHOW PROCESSLIST命令,可是隻能查詢本用戶的進程。kill命令殺死服務器線程。你老是能顯示或殺死你本身的線程,
可是你須要PROCESS權限來顯示或殺死其餘用戶和SUPER權限啓動的線程。 mysqld爲有process權限的用戶保留一個額外的鏈接, 以便一個MySQL root用戶能登陸並檢查,即便全部的正常鏈接在使用。因此當鏈接數達到最大時,普通鏈接創建不了的時候,擁有process權限的用戶仍是能夠鏈接的。 shell>./mysqladmin –uroot –proot restart mysql>kill 3;//殺死id=3的進程。
4、管理權限file 擁有file權限才能夠執行 select ..into outfile和load data infile…操做,可是不要把file, process, super權限授予管理員之外的帳號,這樣存在嚴重的安全隱患。 管理權限(如 super, process, file等)不可以指定某個數據庫,on後面必須跟*.*。 mysql> grant file on *.* to db@localhost; mysql> load data infile ‘/home/mysql/db.txt’ into table db;
5、管理權限super 這個權限容許用戶終止任何查詢;修改全局變量的SET語句;使用CHANGE MASTER,PURGE MASTER LOGS。修改存儲過程須要super權限(): mysql> grant super on *.* to 'ld'@'ip'; mysql> purge master logs before ‘mysql-bin.000006′; 管理權限(如 super, process, file等)不可以指定某個數據庫,on後面必須跟*.*。
6、管理權限Shutdown shell>./mysqladmin –hip –uld –pld shutdown
7、管理權限replication slave 擁有此權限能夠查看從服務器,從主服務器讀取二進制日誌。 mysql> grant replication slave on *.* to 1d@localhost; mysql> show slave hosts; mysql>show binlog events;
8、 replication client 此權限能夠查詢master server、slave server狀態。 mysql> grant Replication client on *.* to ld@localhost; 或:mysql> grant super on *.* to ld@localhost; mysql> show master status;
9、Reload權限 必須擁有reload權限,才能夠執行 flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload命令。 MySQL的FLUSH句法,用於清除或者從新加載內部緩存。而使用flush語句,你必須有reload權限。 (1)flush hosts 清空hostname cache,hostname cache與鏈接時skip-name-resolve有關。 Flush logs: 關閉當前的二進制日誌文件並建立一個新文件,新的二進制日誌文件的名字在當前的二進制文件的編號上加1。 (2)flush logs 關閉當前的二進制日誌文件並建立一個新文件,新的二進制日誌文件的名字在當前的二進制文件的編號上加1。 (3)flush privileges 這個也是常用的,每當從新賦權後,爲了以防萬一,讓新權限當即生效,通常都執行一把,目地是從數據庫受權表中從新裝載權限到緩存中。 (4)flush tables 關閉全部打開的表,同時該操做將會清空查詢緩存中的內容。
(5)flush tables with read lock 關閉全部打開的表,同時對於全部數據庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操做經常用於數據備份的時候。 (6)flush STATUS 重置大多數狀態變量到0。 (7)flush MASTER 刪除全部的二進制日誌索引文件中的二進制日誌文件,重置二進制日誌文件的索引文件爲空,建立一個新的二進制日誌文件,不過這個已經不推薦使用,改爲reset master 了。
(8)flush QUERY CACHE 重整查詢緩存,消除其中的碎片,提升性能,可是並不影響查詢緩存中現有的數據,這點和Flush table 和Reset Query Cache(將會清空查詢緩存的內容)不同的。 (9)flush slave 相似於重置複製吧,讓從數據庫忘記主數據庫的複製位置,同時也會刪除已經下載下來的relay log,與Master同樣,已經不推薦使用,改爲Reset Slave了。這個也頗有用的。 通常來說,Flush操做都會記錄在二進制日誌文件中,可是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不會記錄,所以上述操做若是記錄在二進制日誌文件中話,
會對從數據庫形成影響。注意:Reset操做其實扮演的是一個Flush操做的加強版的角色。 (10) references 有了REFERENCES權限,用戶就能夠將其它表的一個字段做爲某一個表的外鍵約束。 11、 lock tables 必須擁有lock tables權限,纔可使用lock tables mysql> grant lock tables on ld.* to p1@localhost; mysql> lock tables a1 read; mysql> unlock tables;。 12、show view 必須擁有show view權限,才能執行show create view。 mysql> grant show view on ld.* to ld@localhost; mysql> show create view v_shop; 13、show database 經過show database只能看到你擁有的某些權限的數據庫,除非你擁有全局SHOW DATABASES權限。 對於ld@localhost用戶來講,沒有對mysql數據庫的權限,因此以此身份登錄查詢時,沒法看到mysql數據庫: mysql> show databases; <1>skip_show_database 防止不具備SHOW DATABASES權限的人們使用SHOW DATABASES語句。若是你擔憂用戶可以看見屬於其它用戶的數據庫,這樣設置能夠提升安全性。其效果取決於SHOW DATABASES權限:若是變量值爲ON,只容許具備SHOW DATABASES權限的人們使用SHOW DATABASES 語句,而且該語句將顯示全部數據庫名。若是值爲OFF,容許全部用戶執行SHOW DATABASES,但只顯示用戶具備SHOW DATABASES或其它權限的數據庫的名稱。 14. excute 查看並執行存在的Functions,Procedures的權限。 mysql> grant execute on ld.* to 'ld'@'192.168.1.1' identified by 'ld'; 查看並執行存儲過程的權限。例如:執行完這句ld用戶就能夠查看到ld庫中的存儲過程名字,但打開啥也沒有,也能執行,可是不能修改。 mysql> call pro_shop1(0001,@a); mysql> select @a; 15、alter routine權限 必須具備alter routine的權限,纔可使用{alter |drop} {procedure|function} mysql> grant alter routine on ld.* to 'ld'@'%' identified by 'ld'; mysql> drop procedure pro_shop; 16、create routine 建立存儲過程或函數。 mysql> grant create routine on zz4.* to 'ld'@'%' identified by 'ld';//賦予權限 mysql> revoke create routine on zz4.* from 'ld'@'%' identified by 'ld';//收回權限 只賦予create routine權限後,修改存儲過程,報錯 mysql> grant select on ld.* from 'ld'@'192.168.1.1' identified by 'ld'; mysql> grant select routine on ld.* from '*'@'192.168.1.1' identified by 'ld'; 17. create temporary tables (注意這裏是tables,不是table) 必須有create temporary tables的權限,纔可使用create temporary tables. mysql> grant create temporary tables on ld.* to ‘ld′@’localhost’; [mysql@mydev ~]$ mysql -h localhost -u ld -p ld mysql> create temporary table tt1(id int); 18. create view 必須有create view的權限,纔可使用create view mysql> grant create view on ld.* to ‘ld′@’localhost’; mysql> create view v_shop as select price from shop; 19. create user 要使用CREATE USER,必須擁有mysql數據庫的全局CREATE USER權限,或擁有INSERT權限。 mysql> grant create user on *.* to ‘ld′@’localhost’; 或:mysql> grant insert on *.* to ld@localhost; 20. index 必須擁有index權限,才能執行[create |drop] index 21、create權限 數據庫、表或索引. 必須有create的權限,纔可使用create table mysql> grant create on ld.* to ‘ld′@’localhost’; 22、insert權限 23、drop權限 24、delete權限 25、alter 修改表結構、數據庫屬性、存儲過程。 26、update權限、 27、Select權限 查找數據庫、表或索引。 mysql> select * from cat; 另外,鏈接後,查詢只顯示有權限的庫和表和字段,新建的用戶默認有Usage權限,和test庫的訪問權限,能夠對它查詢,修改,刪除等。
權限補充:
【1】proxy user
Mysql假裝用戶,自從MySQL 5.5 發佈第一個版本以來,就在GRANT權限列表裏面新增長了一條記錄: PROXY。 不要覺得這個是之前的MySQL Proxy 哦。其實這個是用來給用戶作馬甲用的。
假裝用戶方法:
步驟1:
mysql> select version();//確保版本是5.5以上
步驟2:
mysql> select * from mysql.plugin; //檢查是否已經加載test_plugin_server插件,默認5.5和5.6版本的mysql,都沒有安裝。
+--------------------+----------------------+
| name | dl |
+--------------------+----------------------+
| test_plugin_server | auth_test_plugin.dll |
+--------------------+----------------------+
步驟3:
//若是沒有安裝插件,執行這句安裝;
mysql> install plugin test_plugin_server soname 'auth_test_plugin.dll';
步驟4:
mysql> create user 'pp_ext'@'%' identified with test_plugin_server as 'pp';
步驟5:
mysql> grant proxy on 'pp'@'%' to 'pp_ext'@'%';
步驟6:
mysql> flush privileges;
步驟7:
退出,用用戶名pp_ext密碼:pp登錄。
報錯:
1251-Client does not support authentication protocol requested by server;consider upgrading MySQL client
@@proxy_user 這個只讀變量爲NULL。沒有假裝成功。得升級客戶端版本。我用的是navicat.
更新完客戶端後,查看一下假裝用戶的權限
Mysql>show grants for ‘pp’@’%’;
操做更正經常使用戶沒什麼區別。
<1> proxy_user
【2】Mysqlaccess命令
用戶權限檢查程序
【3】mysql_setpermission
用於管理用戶權限信息的交互式perl腳本。