mysql 命令大全

第一招、mysql服務的啓動和停止

net stop mysql service mysqld restart/status/stop/start
 

net start mysql /etc/init.d/mysqld restart/status/stop/start
 

第二招、登陸mysql

語法如下: mysql -u用戶名 -p用戶密碼

鍵入命令mysql -uroot -p, 回車後提示你輸入密碼,輸入12345,然後回車即可進入到mysql中了,mysql的提示符是:

mysql>

注意,如果是連接到另外的機器上,則需要加入一個參數-h機器IP

第三招、增加新用戶

格式:grant 權限 on 數據庫.* to 用戶名@登錄主機 identified by "密碼"

如,增加一個用戶user1密碼爲password1,讓其可以在本機上登錄, 並對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入mysql,然後鍵入以下命令:

grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";

如果希望該用戶能夠在任何機器上登陸mysql,則將localhost改爲"%"。

如果你不想user1有密碼,可以再打一個命令將密碼去掉。

grant select,insert,update,delete on mydb.* to user1@localhost identified by "";

第四招: 操作數據庫

1、 顯示數據庫列表。

show databases;

缺省有兩個數據庫:mysql和test。 mysql庫存放着mysql的系統和用戶權限信息,我們改密碼和新增用戶,實際上就是對這個庫進行操作。

2、 顯示庫中的數據表:

use mysql;

show tables;

3、 顯示數據表的結構:

describe 表名;//desc 表名
 

4、 建庫與刪庫:

create database 庫名; // /c 退出
 

drop database 庫名;

5、 建表:

use 庫名;

create table 表名(字段列表);

drop table 表名;

6、 清空表中記錄:

delete from 表名;

7、 顯示錶中的記錄:

select * from 表名;

第五招、導出和導入數據

1. 導出數據:

mysqldump --opt test > mysql.test

即將數據庫test數據庫導出到mysql.test文件,後者是一個文本文件

如:mysqldump -u root -p123456 --databases dbname > mysql.dbname

就是把數據庫dbname導出到文件mysql.dbname中。

2. 導入數據:

mysqlimport -u root -p123456 < mysql.dbname。

不用解釋了吧。

3. 將文本數據導入數據庫:

文本數據的字段數據之間用tab鍵隔開。

use test;

load data local infile "文件名" into table 表名;

1:使用SHOW語句找出在服務器上當前存在什麼數據庫:

mysql> SHOW DATABASES;

2:2、創建一個數據庫MYSQLDATA

mysql> CREATE DATABASE MYSQLDATA;

3:選擇你所創建的數據庫

mysql> USE MYSQLDATA; (按回車鍵出現Database changed 時說明操作成功!)

4:查看現在的數據庫中存在什麼表

mysql> SHOW TABLES;

5:創建一個數據庫表

mysql> CREATE TABLE MYTABLE (name VARCHAR(20), *** CHAR(1));

6:顯示錶的結構:

mysql> DESCRIBE MYTABLE;

7:往表中加入記錄

mysql> insert into MYTABLE values ("hyq","M");

8:用文本方式將數據裝入數據庫表中(例如D:/mysql.txt)

mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;

9:導入.sql文件命令(例如D:/mysql.sql)

mysql>use database;

mysql>source d:/mysql.sql;

10:刪除表

mysql>drop TABLE MYTABLE;

11:清空表

mysql>delete from MYTABLE;

12:更新表中數據

mysql>update MYTABLE set ***="f" where name='hyq';

posted on 2006-01-10 16:21 happytian 閱讀(6) 評論(0) 編輯 收藏 收藏至365Key

13:備份數據庫

mysqldump -u root 庫名>xxx.data

14:例2:連接到遠程主機上的MYSQL

假設遠程主機的IP爲:110.110.110.110,用戶名爲root,密碼爲abcd123。則鍵入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123

(注:u與root可以不用加空格,其它也一樣)

3、退出MYSQL命令: exit (回車)


 


 

  1、前言

  MySQL 是完全網絡化的跨平臺關係型數據庫系統,同時是具有客戶機/服務器體系結構的分佈式數據庫管理系統。它具有功能強、使用簡便、管理方便、運行速度快、安全 可靠性強等優點,用戶可利用許多語言編寫訪問MySQL 數據庫的程序,特別是與PHP更是黃金組合,運用十分廣泛。

  由於MySQL是多平臺的數據庫,它的默認配置要考慮各種情況下都能適用,所以在我們自己的使用環境下應該進行進一步的安全加固。作爲一個MySQL的系統管理員,我們有責任維護MySQL數據庫系統的數據安全性和完整性。

  MySQL數據庫的安全配置必須從兩個方面入手,系統內部安全和外部網絡安全,另外我們還將簡單介紹編程時要注意的一些問題以及一些小竅門。

  2、系統內部安全

  首先簡單介紹一下MySQL數據庫目錄結構。MySQL安裝好,運行了mysql_db_install腳本以後就會建立數據目錄和初始化數據庫。如果我們用MySQL源碼包 安裝,而且安裝目錄是/usr/local/mysql,那麼數據目錄一般會是/usr/local/mysql/var。數據庫系統由一系列數據庫組 成,每個數據庫包含一系列數據庫表。MySQL是用數據庫名在數據目錄建立建立一個數據庫目錄,各數據庫表分別以數據庫表名作爲文件名,擴展名分別爲MYD、MYI、frm的三個文件放到數據庫目錄中。

  MySQL的授權表給數據庫的訪問提供了靈活的權限控制,但是如果本地用戶擁有對 庫文件的讀權限的話,***者只需把數據庫目錄打包拷走,然後拷到自己本機的數據目錄下就能訪問竊取的數據庫。所以MySQL所在的主機的安全性是最首要的 問題,如果主機不安全,被***者控制,那麼MySQL的安全性也無從談起。其次就是數據目錄和數據文件的安全性,也就是權限設置問題。

   從MySQL主站一些老的binary發行版來看,3.21.xx版本中數據目錄的屬性是775,這樣非常危險,任何本地用戶都可以讀數據目錄,所以數據 庫文件很不安全。3.22.xx版本中數據目錄的屬性是770,這種屬性也有些危險,本地的同組用戶既能讀也能寫,所以數據文件也不安全。3.23.xx版本數據目錄的屬性是700,這樣就比較好,只有啓動數據庫的用戶可以讀寫數據庫文件,保證了本地數據文件的安全。

  如果啓動MySQL數據庫的用戶是mysql,那麼象如下的目錄和文件的是安全的,請注意數據目錄及下面的屬性:

  shell>ls -l /usr/local/mysql

  total 40

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 include

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 info

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib

  drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 man

  drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test

  drwxrwxr-x 3 root root 4096 Feb 27 20:07 share

  drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench

  drwx------ 4 mysql mysql 4096 Feb 27 20:07 var

  shell>ls -l /usr/local/mysql/var

  total 8

  drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql

  drwx------ 2 mysql mysql 4096 Feb 27 20:08 test

  shell>ls -l /usr/local/mysql/var/mysql

  total 104

  -rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI

  -rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm

  -rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD

  -rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI

  -rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm

  -rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI

  -rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm

  -rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI

  -rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm

  -rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD

  -rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI

  -rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm

  -rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD

  -rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI

  -rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm

  如果這些文件的屬主及屬性不是這樣,請用以下兩個命令修正之:

  shell>chown -R mysql.mysql /usr/local/mysql/var

  shell>chmod -R go-rwx /usr/local/mysql/var

   用root用戶啓動遠程服務一直是安全大忌,因爲如果服務程序出現問題,遠程***者極有可能獲得主機的完全控制權。MySQL從3.23.15版本開始 時作了小小的改動,默認安裝後服務要用mysql用戶來啓動,不允許root用戶啓動。如果非要用root用戶來啓動,必須加上-user=root的參 數(./safe_mysqld -user=root &)。因爲MySQL中有LOAD DATA INFILE和select ... INTO OUTFILE的SQL語句,如果是root用戶啓動了MySQL服務器,那麼,數據庫用戶就擁有了root用戶的寫權限。不過MySQL還是做了一些限 制的,比如LOAD DATA INFILE只能讀全局可讀的文件,select ... INTO OUTFILE不能覆蓋已經存在的文件。

  本地的日誌文件也不能忽視,包括shell的日誌和MySQL自己的日誌。有些用戶在本地登陸或備份數據庫的時候爲了圖方便,有時會在命令行參數裏直接帶了數據庫的密碼,如:

  shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql

  shell>/usr/local/mysql/bin/mysql -uroot -ptest

   這些命令會被shell記錄在歷史文件裏,比如bash會寫入用戶目錄的.bash_history文件,如果這些文件不慎被讀,那麼數據庫的密碼就會 泄漏。用戶登陸數據庫後執行的SQL命令也會被MySQL記錄在用戶目錄的.mysql_history文件裏。如果數據庫用戶用SQL語句修改了數據庫 密碼,也會因.mysql_history文件而泄漏。所以我們在shell登陸及備份的時候不要在-p後直接加密碼,而是在提示後再輸入數據庫密碼。

  另外這兩個文件我們也應該不讓它記錄我們的操作,以防萬一。

  shell>rm .bash_history .mysql_history

  shell>ln -s /dev/null .bash_history

  shell>ln -s /dev/null .mysql_history

  上門這兩條命令把這兩個文件鏈接到/dev/null,那麼我們的操作就不會被記錄到這兩個文件裏了。

  外部網絡安全

  MySQL數據庫安裝好以後,Unix平臺的user表是這樣的:

  mysql> use mysql;

  Database changed

  mysql> select Host,User,Password,select_priv,Grant_priv from user;

   ----------- ------ ---------- ------------- ------------

  | Host | User | Password | select_priv | Grant_priv |

   ----------- ------ ---------- ------------- ------------

  | localhost | root | | Y | Y |

  | redhat | root | | Y | Y |

  | localhost | | | N | N |

  | redhat | | | N | N |

   ----------- ------ ---------- ------------- ------------

  4 rows in set (0.00 sec)

  Windows平臺的user表是這樣的:

  mysql> use mysql;

  Database changed

  mysql> select Host,User,Password,select_priv,Grant_priv from user;

   ----------- ------ ---------- ------------- ------------

  | Host | User | Password | select_priv | Grant_priv |

   ----------- ------ ---------- ------------- ------------

  | localhost | root | | Y | Y |

  | % | root | | Y | Y |

  | localhost | | | Y | Y |

  | % | | | N | N |

   ----------- ------ ---------- ------------- ------------

  4 rows in set (0.00 sec)

  我們先來看Unix平臺的user表。其中redhat只是我試驗機的機器名,所以實際上Unix平臺的MySQL默認只允許本機才能連接數據庫。但是缺省root用戶口令是空,所以當務之急是給root用戶加上口令。給數據庫用戶加口令有三種方法:

 1)在shell提示符下用mysqladmin命令來改root用戶口令

  shell>mysqladmin -uroot password test

  這樣,MySQL數據庫root用戶的口令就被改成test了。(test只是舉例,我們實際使用的口令一定不能使用這種易猜的弱口令)

  2)用set password修改口令:

  mysql> set password for root@localhost=password(test);

  這時root用戶的口令就被改成test了。

  3)直接修改user表的root用戶口令

  mysql> use mysql;

  mysql> update user set password=password(test) where user=root;

  mysql> flush privileges;

  這樣,MySQL數據庫root用戶的口令也被改成test了。其中最後一句命令flush privileges的意思是強制刷新內存授權表,否則用的還是緩衝中的口令,這時非法用戶還可以用root用戶及空口令登陸,直到重啓MySQL服務器。

  我們還看到user爲空的匿名用戶,雖然它在Unix平臺下沒什麼權限,但爲了安全起見我們應該刪除它:

  mysql> delete from user where user=;

  Windows版本MySQL的user表有很大不同,我們看到Host字段除了localhost還有是%。這裏%的意思是允許任意的主機連接MySQL服務器,這是非常不安全的,給***者造成可乘之機,我們必須刪除Host字段爲%的記錄:

  mysql>delete from user where host=%;

  默認root用戶的空密碼也是必須修改,三種修改方法和Unix平臺一樣。

  我們注意到Host字段爲localhost的匿名用戶擁有所有的權限!就是說本地用戶用空的用戶名和空的口令登陸MySQL數據庫服務器可以得到最高的權限!所以匿名用戶必須刪除!

  mysql> delete from user where user=;

  對user表操作以後不要忘了用flush privileges來強制刷新內存授權表,這樣才能生效。

  默認安裝的Windows版MySQL存在的不安全因素太多,我們在安裝後一定要進一步配置!

   MySQL的5個授權表:user, db, host, tables_priv和columns_priv提供非常靈活的安全機制,從MySQL 3.22.11開始引入了兩條語句GRANT和REVOKE來創建和刪除用戶權限,可以方便的限制哪個用戶可以連接服務器,從哪裏連接以及連接後可以做什 麼操作。作爲MySQL管理員,我們必須瞭解授權表的意義以及如何用GRANT和REVOKE來創建用戶、授權和撤權、刪除用戶。

  在3.22.11版本以前的MySQL授權機制不完善,和新版本也有較大的不同,建議升級到最新版本的MySQL。(本書的操作例子是以MySQL 3.23.49爲樣本)

  我們先來了解授權表的結構。

  1)MySQL授權表的結構與內容:

  mysql> desc user;

   ----------------- ----------------- ------ ----- --------- -------

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

   ----------------- ----------------- ------ ----- --------- -------

  | Host | char(60) binary | | PRI | | |

  | User | char(16) binary | | PRI | | |

  | Password | char(16) binary | | | | |

  | select_priv | enum(N,Y) | | | N | |

  | insert_priv | enum(N,Y) | | | N | |

  | update_priv | enum(N,Y) | | | N | |

  | delete_priv | enum(N,Y) | | | N | |

  | create_priv | enum(N,Y) | | | N | |

  | drop_priv | enum(N,Y) | | | N | |

  | Reload_priv | enum(N,Y) | | | N | |

  | Shutdown_priv | enum(N,Y) | | | N | |

  | Process_priv | enum(N,Y) | | | N | |

  | File_priv | enum(N,Y) | | | N | |

  | Grant_priv | enum(N,Y) | | | N | |

  | References_priv | enum(N,Y) | | | N | |

  | Index_priv | enum(N,Y) | | | N | |

  | alter_priv | enum(N,Y) | | | N | |

   ----------------- ----------------- ------ ----- --------- -------

  17 rows in set (0.01 sec)

  user表是5個授權表中最重要的一個,列出可以連接服務器的用戶及其加密口令,並且它指定他們有哪種全局(超級用戶)權限。在user表啓用的任何權限均是全局權限,並適用於所有數據庫。所以我們不能給任何用戶訪問mysql.user表的權限!

  權限說明:

   ----------- ------------- -----------------------------------------------------------------------

  | 權限指定符| 列名 |權限操作 |

   ----------- ------------- -----------------------------------------------------------------------

  | select | select_priv | 允許對錶的訪問,不對數據表進行訪問的select語句不受影響,比如select 1 1|

   ----------- ------------- -----------------------------------------------------------------------

  | insert | insert_priv | 允許對錶用insert語句進行寫入操作。 |

   ----------- ------------- -----------------------------------------------------------------------

  | update | update_priv | 允許用update語句修改表中現有記錄。 |

   ----------- ------------- -----------------------------------------------------------------------

  | delete | delete_priv | 允許用delete語句刪除表中現有記錄。 |

   ----------- ------------- -----------------------------------------------------------------------

  | create | create_priv | 允許建立新的數據庫和表。 |

   ----------- ------------- -----------------------------------------------------------------------

  | drop | drop_priv | 允許刪除現有的數據庫和表。 |

   ----------- ------------- -----------------------------------------------------------------------

  | Index | Index_priv | 允許創建、修改或刪除索引。 |

   ----------- ------------- -----------------------------------------------------------------------

  | alter | alter_priv | 允許用alter語句修改表結構。 |

   ----------- ------------- -----------------------------------------------------------------------

  | Grant | Grant_priv | 允許將自己擁有的權限授予其它用戶,包括grant。 |

   ----------- ------------- -----------------------------------------------------------------------

  | Reload | Reload | 允許重載授權表,刷新服務器等命令。 |

   ----------- ------------- -----------------------------------------------------------------------

  | Shutdown | Shudown_priv| 允許用mysqladmin shutdown命令關閉MySQL服務器。該權限比較危險, |

  | | | 不應該隨便授予。 |

   ----------- ------------- -----------------------------------------------------------------------

  | Process | Process_priv| 允許查看和終止MySQL服務器正在運行的線程(進程)以及正在執行的查詢語句 |

  | | | ,包括執行修改密碼的查詢語句。該權限比較危險,不應該隨便授予。 |

   ----------- ------------- -----------------------------------------------------------------------

  | File | File_priv | 允許從服務器上讀全局可讀文件和寫文件。該權限比較危險,不應該隨便授予。|

   ----------- ------------- -----------------------------------------------------------------------

  mysql> desc db;

   ----------------- ----------------- ------ ----- --------- -------

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

   ----------------- ----------------- ------ ----- --------- -------

  | Host | char(60) binary | | PRI | | |

  | Db | char(64) binary | | PRI | | |

  | User | char(16) binary | | PRI | | |

  | select_priv | enum(N,Y) | | | N | |

  | insert_priv | enum(N,Y) | | | N | |

  | update_priv | enum(N,Y) | | | N | |

  | delete_priv | enum(N,Y) | | | N | |

  | create_priv | enum(N,Y) | | | N | |

  | drop_priv | enum(N,Y) | | | N | |

  | Grant_priv | enum(N,Y) | | | N | |

  | References_priv | enum(N,Y) | | | N | |

  | Index_priv | enum(N,Y) | | | N | |

  | alter_priv | enum(N,Y) | | | N | |

   ----------------- ----------------- ------ ----- --------- -------

  13 rows in set (0.01 sec)

  db表列出數據庫,而用戶有權限訪問它們。在這裏指定的權限適用於一個數據庫中的所有表。

 mysql> desc host;

   ----------------- ----------------- ------ ----- --------- -------

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

   ----------------- ----------------- ------ ----- --------- -------

  | Host | char(60) binary | | PRI | | |

  | Db | char(64) binary | | PRI | | |

  | select_priv | enum(N,Y) | | | N | |

  | insert_priv | enum(N,Y) | | | N | |

  | update_priv | enum(N,Y) | | | N | |

  | delete_priv | enum(N,Y) | | | N | |

  | create_priv | enum(N,Y) | | | N | |

  | drop_priv | enum(N,Y) | | | N | |

  | Grant_priv | enum(N,Y) | | | N | |

  | References_priv | enum(N,Y) | | | N | |

  | Index_priv | enum(N,Y) | | | N | |

  | alter_priv | enum(N,Y) | | | N | |

   ----------------- ----------------- ------ ----- --------- -------

  12 rows in set (0.01 sec)

  host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它。

  mysql> desc tables_priv;

   ------------- ----------------------------- ------ ----- --------- -------

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

   ------------- ----------------------------- ------ ----- --------- -------

  | Host | char(60) binary | | PRI | | |

  | Db | char(64) binary | | PRI | | |

  | User | char(16) binary | | PRI | | |

  | Table_name | char(60) binary | | PRI | | |

  | Grantor | char(77) | | MUL | | |

  | Timestamp | timestamp(14) | YES | | NULL | |

  | Table_priv | set(select,insert, | | | | |

  | | update,delete,create, | | | | |

  | | drop,Grant,References,| | | | |

  | | Index,alter) | | | | |

  | Column_priv | set(select,insert, | | | | |

  | | update,References) | | | | |

   ------------- ----------------------------- ------ ----- --------- -------

  8 rows in set (0.01 sec)

  tables_priv表指定表級權限。在這裏指定的一個權限適用於一個表的所有列。

  mysql> desc columns_priv;

   ------------- ------------------------ ------ ----- --------- -------

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

   ------------- ------------------------ ------ ----- --------- -------

  | Host | char(60) binary | | PRI | | |

  | Db | char(64) binary | | PRI | | |

  | User | char(16) binary | | PRI | | |

  | Table_name | char(64) binary | | PRI | | |

  | Column_name | char(64) binary | | PRI | | |

  | Timestamp | timestamp(14) | YES | | NULL | |

  | Column_priv | set(select,insert, | | | | |

  | | update,References) | | | | |

   ------------- ------------------------ ------ ----- --------- -------

  7 rows in set (0.00 sec)

  columns_priv表指定列級權限。在這裏指定的權限適用於一個表的特定列。

  2)MySQL授權表運行機制

  MySQL的訪問控制分兩個步驟:

  a)服務器檢查是否允許該用戶連接。

  b)如果該用戶有權連接,那麼服務器還會檢查它的每一個請求是否有足夠的權限。比如:用戶檢索數據庫中的一個表需要有這個數據庫的select權限,用戶刪除數據庫中的一個表需要有這個數據庫的drop權限。

  授權表的user, db, host表使用這兩個步驟,tables_priv和columns_priv表只使用第二步(檢查請求)。每個授權表包含決定一個權限何時運用的範圍列和決定授予哪種權限的權限列。

   範圍列指定表中的權限何時運用。每個授權表條目包含User和Host列來指定權限何時運用於一個給定用戶從給定主機的連接。其他表包含附加的範圍列, 如db表包含一個Db列指出權限運用於哪個數據庫。類似地,tables_priv和columns_priv表包含範圍字段,縮小範圍到一個數據庫中的 特定表或一個表的特定列。

  下面是user表的Host字段和User字段組合的一些例子:

   ----------------------------- -------- --------------------------------------------------------

  | Host值 | User值 | 匹配的連接 |

   ----------------------------- -------- --------------------------------------------------------

  | x.y.z | test | test用戶只能從x.y.z連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | x.y.z | | 任何用戶可以從x.y.z連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | % | test | test用戶可以從任意主機連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | | | 任何用戶可以從任意主機連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | %.y.z | test | test用戶可以從y.z域的任意主機連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | x.y.% | test | test用戶可以從x.y.net, x.y.com, x.y.edu等主機連接數據庫|

   ----------------------------- -------- --------------------------------------------------------

  | 192.168.1.1 | test | test用戶可以從IP地址爲192.168.1.1的主機連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | 192.168.1.% | test | test用戶可以從C類子網192.168.1中的任意主機連接數據庫 |

   ----------------------------- -------- --------------------------------------------------------

  | 192.168.1.0/255.255.255.0 | test | 同上 |

   ----------------------------- -------- --------------------------------------------------------

  SQL的字符串通配符%表示匹配任意字符,可以是0個字符,通配符_表示匹配一個字符。

  權限列指出在範圍列中指定的用戶擁有何種權限。該表使用GRANT語句的權限名稱。對於絕大多數在user、db和host表中的權限列的名稱與GRANT語句中有明顯的聯繫。如select_priv對應於select權限。

3)授權表使用舉例

  grant用於給增加用戶和創建權限,revoke用於刪除用戶權限。

  下面是一些用grant增加用戶和創建權限的例子:

  mysql> grant all privileges on *.* to test@localhost identified by test with grant option;

  這句增加一個本地具有所有權限的test用戶(超級用戶),密碼是test。ON子句中的*.*意味着"所有數據庫、所有表"。with grant option表示它具有grant權限。

  mysql> grant select,insert,update,delete,create,drop privileges on test.* to [email protected]/255.255.255.0 identified by test;

  這句是增加了一個test1用戶,口令是test,但是它只能從C類子網192.168.1連接,對test庫有select,insert,update,delete,create,drop操作權限。

  用grant語句創建權限是不需要再手工刷新授權表的,因爲它已經自動刷新了。

  給用戶創建權限還可以通過直接修改授權表:

   mysql> insert into user values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");

  mysql> flush privileges;

  這兩句和上面第一句grant的效果是一樣的,也是增加了一個本地的test超級用戶。我們看到用grant方便多了,而且還不需flush privileges。

  mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test"));

  mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")

  mysql> flush privileges;

  這三句和上面第二句grant的效果也是一樣的,也是增加了一個只能從C類子網192.168.1連接,對test庫有select,insert,update,delete,create,drop操作權限的test1用戶,口令是test。

  要取消一個用戶的權限,使用revoke語句。revoke的語法非常類似於grant語句,除了to用from取代並且沒有identified by和with grant option子句,下面是用revoke刪除用戶權限的例子:

  mysql> revoke all on test.* from [email protected]/255.255.255.0;

  這句revoke就撤消了上面第二句grant創建的權限,但是test1用戶並沒有被刪除,必須手工從user表刪除:

  mysql> delete from user where user=test1;

  mysql> flush privileges;

  這樣,test1用戶就徹底刪除了。

  這些只是MySQL授權表的簡單使用,更多詳細的資料請見MySQL提供的手冊。

  3、編程需要注意的一些問題

  不管是用哪種程序語言寫連接MySQL數據庫的程序,有一條準則是永遠不要相信用戶提交的數據!

   對於數字字段,我們要使用查詢語句:select * FROM table where ID=234,不要使用select * FROM table where ID=234這樣的查詢語句。MySQL會自動把字串轉換爲數字字符並且去除非數字字符。如果用戶提交的數據經過了mysql_escape_string處理,這樣我們就可以完全杜絕了sql inject***,關於sql inject***請參考下面鏈接的文章:

  http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf

  http://www.ngssoftware.com/papers/advanced_sql_injection.pdf

  各種編程語言該注意的問題:

  1)所有Web程序:

  a)嘗試在Web表單輸入單引號和雙引號來測試可能出現的錯誤,並找出原因所在。

  b)修改URL參數帶的" ("), # (#), 和 ' ()。

  c)對於數字字段的變量,我們的應用程序必須進行嚴格的檢查,否則是非常危險的。

  d)檢查用戶提交的數據是否超過字段的長度。

  e)不要給自己程序連接數據庫的用戶過多的訪問權限。

  2)PHP:

  a)檢查用戶提交的數據在查詢之前是否經過addslashes處理,在PHP 4.0.3以後提供了基於MySQL C API的函數mysql_escape_string()。

  3)MySQL C API:

  a)檢查查詢字串是否用了mysql_escape_string() API調用。

  4)MySQL :

  a)檢查查詢字串是否用了escape和quote處理。

  5)Perl DBI:

  a)檢查查詢字串是否用了quote()方法。

  6)Java JDBC:

  a)檢查查詢字串是否用了PreparedStatement對象。

  4、一些小竅門

   1)如果不慎忘記了MySQL的root密碼,我們可以在啓動MySQL服務器時加上參數--skip-grant-tables來跳過授權表的驗證 (./safe_mysqld --skip-grant-tables & ),這樣我們就可以直接登陸MySQL服務器,然後再修改root用戶的口令,重啓MySQL就可以用新口令登陸了。

  2)啓動MySQL服務器時加--skip-show-database使一般數據庫用戶不能瀏覽其它數據庫。

   3)啓動MySQL服務器時加上--chroot=path參數,讓mysqld守護進程運行在chroot環境中。這樣SQL語句LOAD DATA INFILE和select ... INTO OUTFILE就限定在chroot_path下讀寫文件了。這裏有一點要注意,MySQL啓動後會建立一個mysql.sock文件,默認是在/tmp目錄下。使用了chroot後,MySQL會在chroot_path/tmp去建立mysql.sock文件,如果沒有chroot_path/tmp目錄或啓動MySQL的用戶沒有這個目錄寫權限就不能建立mysql.sock文件,MySQL會啓動失敗。比如我們加了--chroot=/usr /local/mysql/啓動參數,那麼最好建立一個啓動MySQL的用戶能寫的/usr/local/mysql/tmp目錄,當然我們也可以用--socket=path來指定mysql.sock文件的路徑,但這個path一定要在chroot_path裏面。

  4)啓動MySQL服務器時加上--log-slow-queries=file參數,這樣mysqld會把SQL命令執行時間超過long_query_time的寫入file文件。如果沒有指定=file,mysqld默認會寫到數據目錄下的hostname-slow.log。 如果只指定了filename,沒有指定路徑,那麼mysqld也會把filename寫到數據目錄下。我們通過這個日誌文件可以找出執行時間超長的查詢 語句,然後儘可能的優化它減輕MySQL服務器的負擔。

  5)如果我們只需本機使用MySQL服務,那麼我們還可以加上--skip-networking啓動參數使MySQL不監聽任何TCP/IP連接,增加安全性。(非常推薦)

  6)MySQL的更多mysqld啓動選項請見MySQL手冊4.16.4 mysqld Command-line Options


 

忘記MySQL ROOT密碼是在MySQL使用中很常見的問題,可是有很多朋友並不會重置ROOT密碼,那叫苦啊,我有深有感觸,特寫此文章與大家交流:

1、編輯MySQL配置文件:

windows環境中:%MySQL_installdir%\my.ini //一般在MySQL安裝目錄下有my.ini即MySQL的配置文件。
linux環境中:/etc/my.cnf

在[MySQLd]配置段添加如下一行:
skip-grant-tables

保存退出編輯。

2、然後重啓MySQL服務

windows環境中:
net stop MySQL
net start MySQL

linux環境中:
/etc/init.d/MySQLd restart

3、設置新的ROOT密碼

然後再在命令行下執行:
MySQL -uroot -p MySQL
直接回車無需密碼即可進入數據庫了。

現在我們執行如下語句把root密碼更新爲 7758521:
update user set password=PASSWORD("7758521") where user='root';

quit 退出MySQL。

4、還原配置文件並重啓服務

然後修改MySQL配置文件把剛纔添加的那一行刪除。

再次重起MySQL服務,密碼修改完畢。

修改完畢。

用新密碼7758521試一下吧,又能登入MySQL的感覺就是不一樣吧?



方法一:single mode

1. 在 GRUB 選擇界面的時候,按 e
2. 找到這一行【kernel /vmlinuz-2.xxxxxxx ro root=/dev/hda2】按 e
3. 在這一行最後加上 single(要留一個空格再加 single),加完之後按【Enter】跳出
4. 按 b ,開機之後會出現 sh-2.05#
5. 輸入 passwd root ,修改root密碼
6. 改完之後輸入 reboot 重新啓動機器即可

方法二:another single mode

1. 在 GRUB 選擇界面的時候,按 a
2. 然後在命令列最後加入 -s(要留一個空格再加 -s),加完之後按【Enter】就會重新開機

grub append> ro root=/dev/xxxx -s

3. 開機之後會出現 sh-2.05#
4. 輸入 passwd root ,修改root密碼
5. 改完之後輸入 reboot 重新啓動機器即可

方法三:rescue mode(當 / partition 有問題,連 single mode 都進不去的時候用的方法)

1. 用 Red Hat Linux 的第一張光碟開機
2. 在出現 boot: 的時候輸入 linux rescue
boot:linux rescue
3. 【OK】-->【OK】-->【Continue】-->【OK】
//反正就是一直按 Enter 直到出現 sh-2.05a#
4. 輸入 chroot /mnt/sysimage 取得 root 權限
sh-2.05a#chroot /mnt/sysimage
5. 輸入 passwd root ,修改root密碼
6. 改完之後輸入 reboot 重新啓動機器即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章