MySQL(用戶管理,經常使用sql語句,數據庫備份恢復,MySQL調優,恢復誤操做數據)

1、MySQL用戶管理。html

一個MySQL數據庫裏能夠跑多個庫,總不能給全部人的程序員root用戶,則能夠給他們單獨的用戶訪問數據庫。mysql

建立用戶:(grant all on *.* to 'user1'是把全部庫的權限給'user1,他的來源Ip是127.0.0.1,他的密碼是lty123456')linux

(第一個*是庫名,若是你寫成mysql.*那就是對mysql庫的全部權限)程序員

(來源ip也能夠寫成 % ,表示來源的全部ip)sql

(grant這種語句是不會記錄到命令歷史裏去的,由於不安全。)數據庫

mysql> grant all on *.* to 'user1@127.0.0.1' identified by 'lty123456';centos

Query OK, 0 rows affected (0.33 sec)緩存


默認是sock鏈接,因此必需要加-h指定ip,若是不想指定能夠把來源ip換成localhost,localhost就是針對的sock。安全


(把以前的all換成權限則表示不把全部的權限給他,只給他指定的權限。)服務器

mysql> grant SELECT,UPDATE,INSERT on rxr.* to ‘user3’@‘192.168.52.101’ identified by 'westos123';

Query OK, 0 rows affected (0.00 sec)

 

mysql> show grants;               (顯示全部的受權)

+----------------------------------------------------------------------------------------------------------------------------------------+

| Grants for root@localhost                                                                                                              |

+----------------------------------------------------------------------------------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*1836D7557E753782F1509748BD403456701A0D2F' WITH GRANT OPTION |

| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |

+----------------------------------------------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)


mysql> show grants for user2@192.168.52.101;      (查看指定用戶的受權)

    

+----------------------------------------------------------------------------------------------------------------------------+

| Grants for user2@192.168.52.101                                                                                            |

+----------------------------------------------------------------------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'user2'@'192.168.52.101' IDENTIFIED BY PASSWORD '*4B593B8F245CCB70478E5B1FE8BC06557A52FA7E' |

+----------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)


grants命令是能夠添加受權的,好比192.168.52.101是來源ip,我想把192.168.52.102也設置爲來源ip,能夠複製grants的2個字符串,把ip改爲192.168.52.102,則能夠直接和192.168.52.101的密碼同樣,受權同樣。


2、經常使用sql語句


常見的數據庫引擎有2種,

MyISAM和InooDB

MyISAM的特色是會自動幫你統計行數,因此你用下面的命令select count(*)命令就會很快顯示出來。

InooDB若是要用select count(*)或select *時就很慢。

因此儘可能減小select count(*)和select *這種查詢全部的操做。

經常使用sql語句

查詢:

mysql> select count(*) from mysql.user;            (查詢一個數據庫裏的表有多少行)

+----------+ 

| count(*) |

+----------+

|       11 |

+----------+

1 row in set (0.24 sec)


mysql> select * from mysql.db\G;                     (查看mysql.db的全部內容,加\G)

*************************** 1. row ***************************

                 Host: %

                   Db: test

                 User: 

          Select_priv: Y

          Insert_priv: Y

          Update_priv: Y

          Delete_priv: Y

          Create_priv: Y

            Drop_priv: Y

           Grant_priv: N

      References_priv: Y

           Index_priv: Y

           Alter_priv: Y

Create_tmp_table_priv: Y

     Lock_tables_priv: Y

     Create_view_priv: Y

       Show_view_priv: Y

  Create_routine_priv: Y

   Alter_routine_priv: N

         Execute_priv: N

           Event_priv: Y

         Trigger_priv: Y

*************************** 2. row ***************************

                 Host: %

                   Db: test\_%

                 User: 

          Select_priv: Y

          Insert_priv: Y

          Update_priv: Y

          Delete_priv: Y

          Create_priv: Y

            Drop_priv: Y

           Grant_priv: N

      References_priv: Y

           Index_priv: Y

           Alter_priv: Y

Create_tmp_table_priv: Y

     Lock_tables_priv: Y

     Create_view_priv: Y

       Show_view_priv: Y

  Create_routine_priv: Y

   Alter_routine_priv: N

         Execute_priv: N

           Event_priv: Y

         Trigger_priv: Y

*************************** 3. row ***************************

                 Host: ‘192.168.52.101’

                   Db: rxr

                 User: ‘user2’

          Select_priv: Y

          Insert_priv: Y

          Update_priv: Y

          Delete_priv: N

          Create_priv: N

            Drop_priv: N

           Grant_priv: N

      References_priv: N

           Index_priv: N

           Alter_priv: N

Create_tmp_table_priv: N

     Lock_tables_priv: N

     Create_view_priv: N

       Show_view_priv: N

  Create_routine_priv: N

   Alter_routine_priv: N

         Execute_priv: N

           Event_priv: N

         Trigger_priv: N

*************************** 4. row ***************************

                 Host: ‘192.168.52.101’

                   Db: rxr

                 User: ‘user3’

          Select_priv: Y

          Insert_priv: Y

          Update_priv: Y

          Delete_priv: N

          Create_priv: N

            Drop_priv: N

           Grant_priv: N

      References_priv: N

           Index_priv: N

           Alter_priv: N

Create_tmp_table_priv: N

     Lock_tables_priv: N

     Create_view_priv: N

       Show_view_priv: N

  Create_routine_priv: N

   Alter_routine_priv: N

         Execute_priv: N

           Event_priv: N

         Trigger_priv: N

4 rows in set (0.00 sec)


mysql> select user from mysql.user;            (查看指定表的行數)

+-----------------+

| user            |

+-----------------+

| user1@127.0.0.1 |

| lty             |

| root            |

| user2           |

| root            |

|                 |

| root            |

|                 |

| root            |

| ‘user2’         |

| ‘user3’         |

+-----------------+

11 rows in set (0.00 sec)


mysql> select user from db;  (查看db表裏user的字段,db是在mysql庫裏,若是沒有use到mysql裏,還能夠用mysql.db代替db)

+-------------+

| user        |

+-------------+

|             |

|             |

| ‘user2’     |

| ‘user3’     |

+-------------+

4 rows in set (0.00 sec)


mysql> select db,user from mysql.db ;         (也能夠同時查看2個字段的,db和user中間用逗號分隔)

+---------+-------------+

| db      | user        |

+---------+-------------+

| test    |             |

| test\_% |             |

| rxr     | ‘user2’     |

| rxr     | ‘user3’     |

+---------+-------------+

4 rows in set (0.00 sec)


mysql> select * from mysql.db where host like '192.168.%'; (這是一條模糊查詢選項,查找db表包含192.168%的選項,)



增長:

mysql> desc lty.rxr;               (咱們以前在lty這個數據庫裏增長了一個rxr的表)

+-------+----------+------+-----+---------+-------+

| Field | Type     | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| id    | int(4)   | YES  |     | NULL    |       |

| name  | char(40) | YES  |     | NULL    |       |

+-------+----------+------+-----+---------+-------+

2 rows in set (0.00 sec)


mysql> insert into lty.rxr values (1, 'abc');(由於有id和name兩個字段,全部分別加入2個字符,name多是個字符串,因此加單引號)

Query OK, 1 row affected (0.33 sec)


mysql> select * from lty.rxr;                   (查看錶裏的內容)

+------+------+

| id   | name |

+------+------+

|    1 | abc  |

+------+------+

1 row in set (0.00 sec)


也能夠根據條件批量的修改或刪除

mysql> select * from lty.rxr;               (咱們增長三行字段)

+------+------+

| id   | name |

+------+------+

|    1 | abc  |

|    1 | 234  |

|    1 | 234  |

+------+------+

3 rows in set (0.00 sec)


批量的修改:

mysql> update lty.rxr set name='aaa' where id=1;           (把全部id爲1的,name都修改成'aaa')

Query OK, 3 rows affected (0.00 sec)

Rows matched: 3  Changed: 3  Warnings: 0


mysql> select * from lty.rxr;

+------+------+

| id   | name |

+------+------+

|    1 | aaa  |

|    1 | aaa  |

|    1 | aaa  |

+------+------+

3 rows in set (0.00 sec)


批量刪除:

mysql> delete from lty.rxr where id=1;              (刪除全部id=1的字段)

Query OK, 3 rows affected (0.00 sec)


mysql> select * from lty.rxr;

Empty set (0.00 sec)


清空和刪除:清空只是把數據清空,可是表和建立表時的字段還保留,刪除時把表和字段所有幹掉。這兩個命令用以前必定三思!!

清空一個表:

mysql> truncate table lty.rxr;

Query OK, 0 rows affected (0.00 sec)


刪除一個表和一個庫:

mysql> drop table lty.rxr;

Query OK, 0 rows affected (0.00 sec)


mysql> drop database lty;

Query OK, 0 rows affected (0.18 sec)


mysql> show databases;        (查看庫,已經沒有lty這個庫)

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| rxr                |

| test               |

+--------------------+

5 rows in set (0.00 sec)


3、MySQL數據可備份恢復


若是由於本身的誤操做致使數據庫丟失,若是以前備份了數據庫,則無傷大雅,因此這是很重要的知識點。

mysqldump不只能夠備份數據庫,也可也備份表。可是數據太大的咱們有更好的辦法,能夠看拓展。

下面咱們來作mysqldump的實驗。

[root@lnmp ~]# ll /usr/local/mysql/bin/mysqldump           (bin下的這個命令就是用來備份和恢復數據庫)

-rwxr-xr-x. 1 7161 31415 8273183 3月  18 2017 /usr/local/mysql/bin/mysqldump


備份數據庫:

[root@lnmp ~]# mysqldump -uroot -paminglinux rxr > /tmp/mysql.sql     (把數據庫rxr備份到/tmp下並更名爲mysql.sql)

恢復數據庫:

[root@lnmp ~]# mysql -uroot -paminglinux rxr2 < /tmp/mysql.sql      (把/tmp/下的mysql.sql恢復到數據庫中,並更名rxr2)


備份表:

[root@lnmp ~]# mysqldump -uroot -paminglinux mysql user > /tmp/user.sql (把數據庫mysql下的user表備份到/tmp/user.sql)

恢復表:

[root@lnmp ~]# mysql -uroot -paminglinux mysql user2 < /tmp/user.sql (吧/tmp下的user.sql恢復到數據庫更名user2)


(咱們能夠發現,備份用mysqldump,恢復用mysql,不要搞混了。在恢復庫或者表時,觀察他的參數能夠發現,若是存在庫/表,先drop掉,而後建立庫/表,而後再每一行的插入,也是在用sql語句操做)


[root@lnmp ~]# mysql -uroot -paminglinux mysql         (這樣登陸數據後加庫名,直接進入當指定庫下)


備份全部的庫:(-A表示all)

[root@lnmp ~]# mysqldump -uroot -paminglinux -A >/tmp/123.sql  


只備份表的結構,不備份數據:

[root@lnmp ~]# mysqldump -uroot -p123456 -d mysql > /tmp/mysql.d.sql  


4、MySQL調優

MySQL調優能夠從幾個方面來作:
1. 架構層:
作從庫,實現讀寫分離;

2.系統層次:
增長內存;
給磁盤作raid0或者raid5以增長磁盤的讀寫速度;
能夠從新掛載磁盤,並加上noatime參數,這樣能夠減小磁盤的i/o;

3. MySQL自己調優:
(1) 若是未配置主從同步,能夠把bin-log功能關閉,減小磁盤i/o
(2) 在my.cnf中加上skip-name-resolve,這樣能夠避免因爲解析主機名延遲形成mysql執行慢
(3) 調整幾個關鍵的buffer和cache。調整的依據,主要根據數據庫的狀態來調試。如何調優能夠參考5.

4. 應用層次:
查看慢查詢日誌,根據慢查詢日誌優化程序中的SQL語句,好比增長索引

5. 調整幾個關鍵的buffer和cache

1) key_buffer_size  首先能夠根據系統的內存大小設定它,大概的一個參考值:1G如下內存設定128M;2G/256M; 4G/384M;8G/1024M;16G/2048M.這個值能夠經過檢查狀態值Key_read_requests和 Key_reads,能夠知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該儘量的低,至少是1:100,1:1000更好(上述狀態值可使用SHOW STATUS LIKE ‘key_read%’得到)。注意:該參數值設置的過大反而會是服務器總體效率下降!


2) table_open_cache 打開一個表的時候,會臨時把表裏面的數據放到這部份內存中,通常設置成1024就夠了,它的大小咱們能夠經過這樣的方法來衡量: 若是你發現 open_tables等於table_cache,而且opened_tables在不斷增加,那麼你就須要增長table_cache的值了(上述狀態值可使用SHOW STATUS LIKE ‘Open%tables’得到)。注意,不能盲目地把table_cache設置成很大的值。若是設置得過高,可能會形成文件描述符不足,從而形成性能不穩定或者鏈接失敗。


3) sort_buffer_size 查詢排序時所能使用的緩衝區大小,該參數對應的分配內存是每鏈接獨佔!若是有100個鏈接,那麼實際分配的總共排序緩衝區大小爲100 × 4 = 400MB。因此,對於內存在4GB左右的服務器推薦設置爲4-8M。


4) read_buffer_size 讀查詢操做所能使用的緩衝區大小。和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享!


5) join_buffer_size 聯合查詢操做所能使用的緩衝區大小,和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享!


6) myisam_sort_buffer_size 這個緩衝區主要用於修復表過程當中排序索引使用的內存或者是創建索引時排序索引用到的內存大小,通常4G內存給64M便可。


7) query_cache_size MySQL查詢操做緩衝區的大小,經過如下作法調整:SHOW STATUS LIKE ‘Qcache%’; 若是Qcache_lowmem_prunes該參數記錄有多少條查詢由於內存不足而被移除出查詢緩存。經過這個值,用戶能夠適當的調整緩存大小。若是該值很是大,則代表常常出現緩衝不夠的狀況,須要增長緩存大小;Qcache_free_memory:查詢緩存的內存大小,經過這個參數能夠很清晰的知道當前系統的查詢內存是否夠用,是多了,仍是不夠用,咱們能夠根據實際狀況作出調整。通常狀況下4G內存設置64M足夠了。


8) thread_cache_size 表示能夠從新利用保存在緩存中線程的數,參考以下值:1G  —> 8 2G  —> 16 3G  —> 32  >3G  —> 64
除此以外,還有幾個比較關鍵的參數:


9) thread_concurrency 這個值設置爲cpu核數的2倍便可


10) wait_timeout 表示空閒的鏈接超時時間,默認是28800s,這個參數是和interactive_timeout一塊兒使用的,也就是說要想讓wait_timeout 生效,必須同時設置interactive_timeout,建議他們兩個都設置爲10


11) max_connect_errors 是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的狀況。與性能並沒有太大關係。爲了不一些錯誤咱們通常都設置比較大,好比說10000 


12) max_connections 最大的鏈接數,根據業務請求量適當調整,設置500足夠


13) max_user_connections 是指同一個帳號可以同時鏈接到mysql服務的最大鏈接數。設置爲0表示不限制。一般咱們設置爲100足夠 


一位同窗調優的經歷:http://ask.apelearn.com/question/11281



恢復誤操做的數據:http://www.centoscn.com/mysql/2015/0204/4630.html

相關文章
相關標籤/搜索