数据库的导出与导入。

这里介绍的是数据库的导入与导出,

其实,单个数据表的导入与导出也是这些命令,

只是携带的”参数“不同而已。

具体的方法,可以在Shell中运行 “命令 --help” 来查看。

下面只是介绍常用的对数据库的导入与导出方法。

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

导出数据库。

命令:$pg_dump  testdb >  testdump.dmp

解释:将数据库testdb备份成文件testdump.dmp。包括表的建立与表中的数据。

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

导入数据库。

命令:

$create -E UTF8  testdb1

$psql  testdb1 < testdump.dmp

解释:

1、先创建一个数据库testdb1,为了将dump文件导入这个数据库,

-E选项是为了指定这个数据库的字符集。取决于导出数据库的字符集。

2、psql 命令使用重定向符”<“将dump文件导入指定的数据库。

3、导入数据库以前除了要指定数据库端的字符集,又是还要设置客户端的字符集,

由于psql是在shell下执行的命令,不能使用\encoding指令,

所以要使用pgclientencoding环境变量,

所以要在导入数据库以前要执行命令:

export pgclientencoding='UTF8'

设置客户端正确的字符集,这里设置的UTF8是一个例子而已。

对于windows用户,可能是需要执行:

SET pgclientencoding='UTF8'

我也没有试过,应该是这句。

添加和删除用户。

添加用户。

createuser 是 SQL 命令 CREATE USER的封装。

命令:createuser  [-a] [-A] [-d]  [-D] [-e] [-P] [-h 主机名] [-p  port]  用户名

说明:

[-a]:允许创建其他用户,相当于创建一个超级用户;

[-A]:不允许此用户创建其他用户;

[-d]:允许此用户创建数据库;

[-D]:不允许此用户创建数据库;

[-e]:将执行过程显示到Shell上;

[-P]:创建用户时,同时设置密码;

[-h 主机名]:为某个主机上的Postgres创建用户;

[-p  port]:与-h参数一同使用,指定主机的端口。

例子:

1、不带参数的创建用户。

$ createuser testuser

Shall the new user be allowed to create databases? (y/n) n

Shall the new user be allowed to create more new users? (y/n) n

CREATE USER

不带参数创建用户时,Postgres会询问此用户的权限。

2、为指定的主机和端口上创建用户。

$ createuser -h 172.28.18.51 -p 5000 -D -A -e testuser

CREATE USER joe NOCREATEDB NOCREATEUSER;

CREATE USER

这个命令为主机172.28.18.51的5000端口创建用户testuser,

此用户不可以创建数据库和其他用户。

3、创建超级用户。

$ createuser -P -d -a -e testuser

Enter password for new user: testuser

Enter it again: testuser

CREATE USER joe PASSWORD 'testuser' CREATEDB CREATEUSER;

CREATE USER

这个命令在本地创建一个超级用户(-a),可以创建数据库(-d),

同时要求设置密码。

由于带了创建数据库和创建用户的参数,

所以Postgres不会像例子1中那样再次询问。

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

删除用户。

命令:dropuser [-i] [-h] [-p] [-e]  用户名

解释:

[ -i]:删除用户前,要求确认;

[-h 主机名]:删除某个主机上的Postgres用户;

[-p  port]:与-h参数一同使用,指定主机的端口;

[-e]:将执行过程显示到Shell上。

例子:

1、删除本地的Postgres用户。

$ dropuser testuser

DROP USER

2、删除远程Postgres服务器上的用户。

$ dropuser -p 5000 -h 172.28.18.51 -i -e testuser

User "testuser" and any owned databases will be permanently deleted.

Are you sure? (y/n) y

DROP USER "testuser"

DROP USER

此命令删除主机172.28.18.51(-h)的5000端口(-p)的用户testuser,

并且需要确认(-i)。

psql的常用命令。

^_^

终于可以切入正体了。

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

连接Postgres服务器后,

可能第一件事,就是连接到一个数据库进行实际的操作了,

如果您没有在运行 psql 命令时指定连接的数据库,

那么现在可以发出指令来连接一个数据库,

当然,在运行 psql 命令时指定连接的数据库的话,

也可以使用下面这个指令来改变连接的数据库。

命令:\c  数据库名

例子:

testdb=>\c  tesdb1

这条命令将当前连接的testdb数据库改变成 testdb1 。

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

下面就来看看如何断开与Postgres服务器的连接,

命令:\q

这个命令很简单,执行这个指令后,

就回到了shell提示符下了。

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

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

将数据库 导出到 文件标识符

命令:\copy 表名 to 文件名|标准输出 [delimiter  as  '分隔符']  [null  as 'null表示的字符串' ]

        [csv  quote  as '引号的类型'] 

解释:

可以将表中的数据输出到 文件或标准输出。

delimiter as '分隔符'   :说明输出设备的文本中表的每个字段用什么字符分割,默认是tab;

null  as 'null表示的字符串':说明输出设备的文本中表的NULL值的表示方法,默认为“\N”;

csv quote as '引号类型' :说明导出的csv文件中的引号类型是什么,

对于Postgres7.4以前的版本,不支持csv的导入与导出,这时不要使用这个可选项。

例子:

testdb=>\copy  testtable to data.csv  delimiter as ',' csv quote as '"'

这条命令将testtable表中的内容作为SQL语句,导出data.csv文件中。

delimiter as ','   :说明data.txt文本中表的每个字段用“逗号”分割;

csv quote as '"' :说明csv中的引号类型是“双引号”。

像前面说的:这个例子不适用在Postgres7.4以前的版本。

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

从 文件标识符 导入数据到数据库

命令:\copy 表名 form 文件名|标准输入 [delimiter  as  '分隔符']  [null  as 'null表示的字符串' ]

        [csv  quote  as '引号的类型'] 

解释:

可以从 文件名|标准输入 两个文件设备导入到指定的表中

delimiter as '分隔符'   :说明输入设备的文本中表的每个字段用什么字符分割,

通常是tab,取决于copy出去的文件是什么参数;

null  as 'null表示的字符串':说明输入设备的文本中表的NULL值的表示方法,通常为“\N”;

csv quote as '引号类型' :说明导入的csv文件中的引号类型是什么,

取决于copy出去的文件是什么参数。

例子:

testdb=>\copy  testtable from data.csv  delimiter as ',' csv quote as '"'

这条命令将data.csv文件中的文本,作为sql语句导入到testtable表,

delimiter as ','   :说明data.txt文本中表的每个字段用“逗号”分割;

csv quote as '"' :说明csv中的引号类型是“双引号”。

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

显示和设置客户端字符集。

命令:\encoding [ encoding ]

解释:

在数据库领域,存在字符集的转换问题,

一般地,服务器端字符集是在建立数据库时指定的,

为了能够在不同的客户终端显示正确的数据,

需要认为的为客户终端设置客户端字符集。

如果服务器端的字符集是EUC_JP(日语字符集),

而客户终端的字符集是GBK,

捡索出来的汉字数据很可能就出现乱码,

所以要统一两边的字符集。

例子:

1、显示客户端字符集

testdb=>\encoding

这条命令没有带可选参数,

所以显示当前的客户终端字符集。

2、设置客户端字符集

testdb=>\encoding 'EUC_JP'

这条命令设置当前的客户终端字符集为“EUC_JP”,

如果服务器端的字符集也是“EUC_JP”,就可以正常显示数据了。

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

除了上面这些介绍,在这个客户终端可以使用所有标准SQL语句,

对数据库进行操作。

使用psql连接Postgres数据库。

前面已经介绍了Postgres的安装,

和远程连接Postgres服务器的方式,

这次就说一下如何使用Postgres。

命令:psql 【选项】 <数据库名称>

举例:

1、连接本地的Postgres服务器

psql

然后输入密码即可连接testdb。

注意:这种方式使用的很少,

因为没有带任何“选项”,

所以使用的都是默认值。

它将以当前操作系统的登陆名登陆,

并且请求连接Postgres服务器中以当前操作系统的登陆名同名的数据库。

2、连接本地的一个数据库testdb

psql testdb

然后输入密码即可连接testdb。

注意:此时连接Postgres的用户是操作系统的登陆用户。

3、指定一个用户testuser、连接本地的一个数据库testdb

psql -U testuser testdb

然后输入密码即可使用户testuser连接testdb。

注意:此时使用了“-U”选项指定一个Postgres已存在的用户。

至于如何向Postgres添加用户,后面再说。

4、指定一个用户testuser、连接远程的Postgres(172.28.18.51)的一个数据库testdb

psql -U testuser -h 172.28.18.51 testdb

然后输入密码即可使用户testuser连接到主机为172.28.18.51上的testdb。

注意:此时使用了“-h”选项指定一个远程Postgres主机的IP(或主机名)。

要想实现远程连接Postgres主机,请参看【远程连接PostgreSQL服务器。】

至此,就连接上了Postgres服务器,

提示符将变成:

数据库名=>

可以使用SQL语句进行数据库的操作了。

MySQL 存取權限系統(转帖)

MySQL中文參考手冊-權限(转自:http://sy3es.tnc.edu.tw/teaching/php_mysql/mysql.htm)

1 權限系統做什麼

MySQL權限系統的主要功能是証實連接到一台給定主機的一個用戶,並且賦予該用戶在一個資料庫上select、 insert、update和delete的權限。

附加的功能包括有一個匿名的用戶和對於MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。

2 MySQL 用戶名和密碼

由MySQL使用用戶名和密碼的方法與Unix或Windows使用的方式有很多不同之處:

    * MySQL使用於認証目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關。

    * MySQL用戶名最長可以是16各字符﹔典型地,Unix用戶名限制為8個字符。

    * MySQL密碼與Unix密碼沒關系。在你使用登錄到一台Unix機器密碼和你使用在那台機器上存取一個資料庫的密碼之間沒有必要有關聯。

    * MySQL加密密碼使用了一個Unix登錄期間所用的不同算法,使用PASSWORD()和ENCRYPT()函數部分。

3 使你的密碼安全

以一種暴露的可被其他用戶發現的方式指定你的密碼是不妥當的。當你運行客戶程式時,你可以使用下列方法指定你的密碼,還有每個方法的風險評估:

    * 使用一個在命令行上-pyour_pass或--password=your_pass的選項。這很方便但是不安全,因為你的密碼對系統狀態程式(例如ps)變得可見,它可以被其他的用戶調用來顯示命令行。(一般MySQL客戶在他們的初始化順序期間用零覆蓋命令行參數,但是仍然有一個短暫間隔時間內參數值可見的。)

    * 使用一個-p或--password選項(沒有指定your_pass值)。在這種情況下,客戶程式請求來自終端的密碼:

shell>mysql - u  user_name - p

Enter password: ********

      客戶回應“*”字符到作為輸入你的密碼的終端使得旁觀者不能看見它。因為它對其他用戶不可見,與在命令行上指定它相比,這樣進入你的密碼更安全。然而,這個輸入一個密碼的方法僅僅為你交互式運行程式是合適的。如果你想要從非交互式運行的一個腳本調用一個客戶,就沒有從終端輸入入密碼的機會。

4  MySQL提供的權限

權限資訊用user、db、host、tables_priv和columns_priv表被儲存在mysql資料庫中(即在名為mysql的資料庫中)。在MySQL啟動時和在6.9 權限修改何時生效所說的情況時,伺服器讀入這些資料庫表內容。

 

5 權限系統工作原理

MySQL權限系統保証所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL伺服器時, 你的身份由你從那連接的主機和你指定的用戶名來決定,系統根據你的身份和你想做什麼來授予權限。

MySQL在認定身份中考慮你的主機名和用戶名字,是因為有很小的原因假定一個給定的用戶在網際網路上屬於同一個人。例如,用戶從whitehouse.gov連接的bill不必和從mosoft.com連接bill是同一個人。 MySQL通過允許你區分在不同的主機上碰巧有同樣名字用戶來處理它:你可以對從whitehouse.gov連接授與bill一個權限集,而為從microsoft.com的連接授予一個不同的權限集。

MySQL存取控制包含2個階段:

    * 階段1:伺服器檢查你是否允許連接。

    * 階段2:假定你能連接,伺服器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從資料庫中一個表選取(select)行或從資料庫拋棄一個表,伺服器確定你對表有select權限或對資料庫有drop權限。

 

6存取控制, 階段1:連接証實

當你試圖聯接一個MySQL伺服器時,伺服器基於你的身份和你是否能通過供應正確的密碼驗証身份來接受或拒絕連接。如果不是,伺服器完全具結你的存取,否則,伺服器接受連接,然後進入階段2並且等待請求。

你的身份基於2個資訊:

    * 你從那個主機連接

    * 你的MySQL用戶名

身份檢查使用3個user表(Host, User和Password)範圍字段執行。伺服器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的密碼時才接受連接。

在user表範圍字段可以如下被指定:

    * 一個Host值可以是主機名或一個IP數字,或'localhost'指出本地主機。

    * 你可以在Host字段裡使用通配符字符“%”和“_”。

    * 一個Host值'%'匹配任何主機名,一個空白Host值等價於'%'。注意這些值匹配能創建一個連接到你的伺服器的任何主機!

    * 通配符字符在User字段中不允許,但是你能指定空白的值,它匹配任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名,用戶被認為是匿名用戶(沒有名字的用戶),而非客戶實際指定的名字。這意味著一個空白的用戶名被用於在連接期間的進一步的存取檢查(即,在階段2期間)。

    * Password字段可以是空白的。這不意味著匹配任何密碼,它意味著用戶必須不指定一個密碼進行連接。



7 存取控制,階段2:請求証實

一旦你建立了一個連接,伺服器進入階段2。對在此連接上進來的每個請求,伺服器檢查你是否有足夠的權限來執行它,它基於你希望執行的操作類型。這正是在授權表中的權限字段發揮作用的地方。這些權限可以來子user、db、host、tables_priv或columns_priv表的任何一個。授權表用GRANT和REVOKE命令操作。見7.26 GRANT和REVOKE 句法。(你可以發覺參考6.6 權限系統怎樣工作很有幫助,它列出了在每個權限表中呈現的字段。)

user表在一個全局基礎上授予賦予你的權限,該權限不管當前的資料庫是什麼均適用。例如,如果user表授予你delete權限, 你可以刪除在伺服器主機上從任何資料庫刪除行!換句話說,user表權限是超級用戶權限。只把user表的權限授予超級用戶如伺服器或資料庫主管是明智的。對其他用戶,你應該把在user表中的權限設成'N'並且僅在一個特定資料庫的基礎上授權, 使用db和host表。

db和host表授予資料庫特定的權限。在範圍字段的值可以如下被指定:

    * 通配符字符“%”和“_”可被用於兩個表的Host和Db字段。

    * 在db表的'%'Host值意味著“任何主機”,在db表中一個空白Host值意味著“對進一步的資訊咨詢host表”。

    * 在host表的一個'%'或空白Host值意味著“任何主機”。

    * 在兩個表中的一個'%'或空白Db值意味著“任何資料庫”。

    * 在兩個表中的一個空白User值匹配匿名用戶。

db和host表在伺服器啟動時被讀取和排序(同時它讀user表)。db表在Host、Db和User範圍字段上排序,並且host表在Host和Db範圍字段上排序。對於user表,排序首先放置最特定的值然後最後最不特定的值,並且當伺服器尋找匹配入條目時,它使用它找到的第一個匹配。

tables_priv和columns_priv表授予表和列特定的權限。在範圍字段的值可以如下被指定:

    * 通配符“%”和“_”可用在使用在兩個表的Host字段。

    * 在兩個表中的一個'%'或空白Host意味著“任何主機”。

    * 在兩個表中的Db、Table_name和Column_name字段不能包含通配符或空白。

tables_priv和columns_priv表在Host、Db和User字段上被排序。這類似於db表的排序,盡管因為只有Host字段可以包含通配符,但排序更簡單。

 

8 權限更改何時生效

當mysqld啟動時,所有的授權表內容被讀進儲存器並且從那點生效。

用GRANT、REVOKE或SET PASSWORD對授權表施行的修改會立即被伺服器注意到。

如果你手工地修改授權表(使用INSERT、UPDATE等等),你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴伺服器再裝載授權表,否則你的改變將不生效,除非你重啟伺服器。

當伺服器注意到授權表被改變了時,現存的客戶連接有如下影響:

    * 表和列權限在客戶的下一次請求時生效。

    * 資料庫權限改變在下一個USE db_name命令生效。

全局權限的改變和密碼改變在下一次客戶連接時生效。

9 建立初始的MySQL權限

你的安裝初始時廣開大門,你首先應該做的事情之一是為MySQL root用戶指定一個密碼。你可以做如下(注意,你使用PASSWORD()函數指定密碼):

shell> mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('new_password')

           WHERE user='root';

mysql> FLUSH PRIVILEGES;

在MySQL 3.22和以上版本中,你可以使用SET PASSWORD語句:

shell> mysql -u root mysql

mysql> SET PASSWORD FOR root=PASSWORD('new_password');

設置密碼的另一種方法是使用mysqladmin命令:

shell> mysqladmin -u root password new_password

注意:如果你使用第一種方法在user表裡直接更新密碼,你必須告訴伺服器再次讀入授權表(用FLUSH PRIVILEGES),因為否則改變將不被注意到。

一旦root密碼被設置,此後當你作為root與伺服器連接時,你必須供應那個密碼。

 

10 向MySQL增加新用戶權限

你可以有2個不同的方法增加用戶:通過使用GRANT語句或通過直接操作MySQL授權表。比較好的方法是使用GRANT語句,因為他們是更簡明並且好像錯誤少些。

下面的例子顯示出如何使用mysql客戶安裝新用戶。這些例子假定權限根據以前的章節描述的內定被安裝。這意味著為了改變,你必須在mysqld正在運行同一台機器上,你必須作為MySQL root用戶連接,並且root用戶必須對mysql資料庫有insert權限和reload管理權限。另外,如果你改變了root用戶密碼,你必須如下的mysql命令指定它。

你可以通過發出GRANT語句增加新用戶:

shell> mysql --user=root mysql

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost

           IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"

           IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;

mysql> GRANT USAGE ON *.* TO dummy@localhost;

這些GRANT語句安裝3個新用戶:

monty

    可以從任何地方連接伺服器的一個完全的超級用戶,但是必須使用一個密碼('something'做這個。注意,我們必須對monty@localhost和monty@"%"發出GRANT語句。如果我們增加localhost條目,對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮,因為它有更特定的Host字段值,所以以user表排列順序看更早到來。

admin

    可以從localhost沒有一個密碼進行連接並且被授予reload和process管理權限的用戶。這允許用戶執行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,還有mysqladmin processlist。沒有授予資料庫有關的權限。他們能在以後通過發出另一個GRANT語句授權。

dummy

    可以不用一個密碼連接的一個用戶,但是只能從本地主機。全局權限被設置為'N'--USAGE權限類型允許你無需權限就可設置一個用戶。它假定你將在以後授予資料庫相關的權限。

你也可以直接通過發出INSERT語句增加同樣的用戶存取資訊,然後告訴伺服器再次裝入授權表:

shell> mysql --user=root mysql

mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),

                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),

                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

mysql> INSERT INTO user SET Host='localhost',User='admin',

                 Reload_priv='Y', Process_priv='Y';

mysql> INSERT INTO user (Host,User,Password)

                        VALUES('localhost','dummy','');

mysql> FLUSH PRIVILEGES;

取決於你的MySQL版本,對上述,你可能必須使用一個不同數目'Y'值(在3.22.11以前的版本有更少的權限列)。對admin用戶,只用在3.22.11開始的版本具有的更加可讀的INSERT擴充的語法。

注意,為了設置一個超級用戶,你只需創造一個user表條目,其權限字段設為'Y'。不需要db或host表的條目。

在user表中的權限列不是由最後一個INSERT語句明確設置的(對dummy用戶),因此那些列被賦予內定值'N'。這是GRANT USAGE做的同樣的事情。

下列例子增加一個用戶custom,他能從主機localhost、server.domain和whitehouse.gov連接。他只想要從localhost存取bankaccount資料庫,從whitehouse.gov存取expenses資料庫和從所有3台主機存取customer資料庫。他想要從所有3台主機上使用密碼stupid。

為了使用GRANT語句設置個用戶的權限,運行這些命令:

shell> mysql --user=root mysql

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON bankaccount.*

           TO custom@localhost

           IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON expenses.*

           TO custom@whitehouse.gov

           IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON customer.*

           TO custom@'%'

           IDENTIFIED BY 'stupid';

通過直接修改授權表設置用戶權限,運行這些命令(注意,在結束時FLUSH PRIVILEGES):

shell> mysql --user=root mysql

mysql> INSERT INTO user (Host,User,Password)

       VALUES('localhost','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

       VALUES('server.domain','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

       VALUES('whitehouse.gov','custom',PASSWORD('stupid'));

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES

       ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES

       ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES;

頭3個INSERT語句增加user表條目,允許用戶custom用給定密碼從不同的主機進行連接,但是沒有授予任何許可(所有權限被設置為內定值'N')。後3個INSERT語句增加db表條目,授予custom以bankaccount、expenses和customer資料庫權限,但是只能在從正確的主機存取時。通常,在授權表直接被修改時,伺服器必須被告知再次裝入他們(用FLUSH PRIVILEGES)以便使權限修改生效。

如果你想要給特定的用戶從一個給定的域上的任何機器上存取權限,你可以發出一個如下的GRANT語句:

mysql> GRANT ...

           ON *.*

           TO myusername@"%.mydomainname.com"

           IDENTIFIED BY 'mypassword';

為了通過直接修改授權表做同樣的事情,這樣做:

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',

           PASSWORD('mypassword'),...);

mysql> FLUSH PRIVILEGES;

 

11 怎樣設置密碼

在前面小節的例子裡說明了一個重要的原則:當你使用INSERT或UPDATE語句儲存一個非空的密碼時,你必須使用PASSWORD()函數加密它。這是因為在user表刈脛加密形式儲存密碼,而不是作為純文本。如果你忘記這個事實,你可能像這樣試圖設置密碼:

shell> mysql -u root mysql

mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit');

mysql> FLUSH PRIVILEGES

結果是純文本值'biscuit'作為密碼被儲存在user表中。在用戶jeffrey試圖用這個密碼連接伺服器時,mysql客戶用PASSWORD()加密它並且將結果送給伺服器,伺服器比較在user表中的值(它是純文本值'biscuit')和加密的密碼(而不是 'biscuit'),比較失敗並且伺服器拒絕連接:

shell> mysql -u jeffrey -pbiscuit test

Access denied

因為當他們被插入user表時,密碼必須被加密,相反,INSERT語句應該像這樣被指定:

mysql> INSERT INTO user (Host,User,Password)

       VALUES('%','jeffrey',PASSWORD('biscuit'));

當你使用SET PASSWORD語句時,你也必須使用PASSWORD()函數:

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');

如果你使用GRANT ... IDENTIFIED BY語句或mysqladmin password命令設置密碼,PASSWORD()函數是不必要的。他們都考慮到為你加密密碼,多以你可像這樣指定一個密碼'biscuit':

mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';

shell> mysqladmin -u jeffrey password biscuit

注意: PASSWORD()不是以在Unix密碼加密的同樣方法施行密碼加密。你不應該假定如果你的Unix密碼和你的MySQL密碼是一樣的,PASSWORD()將導致與在Unix密碼文件被儲存的同樣的加密值。

PostgreSQL 昨天,今天和明天(即其简介)(转帖)

   PostgreSQL 昨天,今天和明天(转自:http://www.pgsqldb.org/twiki/bin/view/PgSQL/PostgreSQL)

    * PostgreSQL 昨天,今天和明天

          o 1.简介

          o 2.前言

          o 3.历史

                + 3.1 出身名门

                + 3.2 创世纪——Ingres

                + 3.3 新项目 Postgres

                + 3.4 炎黄子孙的贡献 Postgres95

                + 3.5 国际化 PostgreSQL

          o 4. 特点

          o 5. 人物

                + 5.1 Tom Lane:

                + 5.2 Vadim Mikheev:

                + 5.3 Jan Wieck:

                + 5.4 Thmas Lockhart:

                + 5.5 Bruce Monjian:

                + 5.6 Marc Fournier:

                + 5.7 Peter Eisentraut:

          o 6. 展望

          o 7.后记

          o 8. 附录

                + 8.1 参考资料

                + 8.2 历史

                + 8.3 特性

          o 9. 注释:

1.简介

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。请参看本站主要成员何伟平(BITBIRD)的文章“PostgreSQL的昨天、今天和明天—自由软件数据库PostgreSQL简介”。

PostgreSQL 的昨天今天和明--自由软件数据库 PostgreSQL 简介 v2.0

2.前言

今天,如果人们谈论起计算机操作系统,肯定有非常多的人会津津乐道自由软件操作系统Linux,毕竟,众人拾柴火焰高, 如今没有任何人敢于忽视 Linux 这个自由软件操作系统在我们星球的存在,就连国内比较特殊的环境下,也不断地有 各种各样的 Linux 秀出现让公众,甚至是那些对计算机知之甚少的群众都能意识到 Linux 的存在。但是,如果我们 说起数据库,可能绝大多数人只会记得有 Oracle,IBM DB2,Informix,Sybase,MS SQL Server,以及在互联网广为 使用的轻量级 Mysql,而提到 PostgreSQL 的名字,可能很多人都会皱起眉毛:“这是什么?”

“PostgreSQL 是一种特性非常齐全的自由软件的对象-关系性数据库管理系统(ORDBMS),它的很多特性正是当今许多商业数据库的前身” --摘自 PostgreSQL 手册。

为了让大家能够清楚的了解 PostgreSQL,请听我细细道来。

3.历史

3.1 出身名门

谈到 PostgreSQL,我们不得不谈 Berkeley,也就是中文中的“加州大学伯克利分校”这所大名鼎鼎的大学。 老实说,伯克利(BSD)对计算机科学的贡献可谓巨大,在整个计算机科学的发展史上,几乎到处都有这所学 校的研究人员和学生的足迹。只要稍微对计算机技术史有些记忆的人都会记得在 Unix 操作系统的发展里程碑 上 BSD 这三个字的分量,然而也许正是由于 BSD 在系统和网络领域里的光芒太耀眼,掩盖了 BSD 对计算机技术其他分支的贡献,而PostgreSQL 正是其中之一。

3.2 创世纪——Ingres

追本溯源地讲,PostgreSQL 最早开始于 BSD 的 Ingres 项目,这个项目主要是研究关系型数据库技术,早在 1970 年 E.F. Codd 就提出了关系模型,从那以后,人类在计算机领域的数据管理就进入了一个新的时期。从此人们开始用抽象的关系语句来描述自己的 数据,大大提高了人类对数据的抽象描述能力。而 Ingres 项目正是就此进行研究的,它始于 1977 年,到 1985 年结束,而其研究成果后来被一家叫 Relational Technologies 的商业公司拿去做成了商品软件,后来这家公司又被 Computer Associates(CA)收购,不知道 CA 的 JASMINE里面是否还有当年 Ingres 的影子?

3.3 新项目 Postgres

然后,从1986年开始,BSD 的 Michael Stonebraker 教授领导了称为 Postgres 的“后Ingres”项目, 其主要目的是数据库管理系统的更高级研究,因此而产生了 PostgreSQL 的直接前身,Postgres,而 PostgreSQL 的名字也是从 Postgres 项目继承过来的。 这个项目的成果是非常巨大的,在现代数据库的许多方面都做出的大量的贡献,比如,面向对象的数据库, 部分索引技术,规则,过程和数据库扩展等方面都走在了数据库管理系统的前列。而且,Stonebraker 教授还做出了一件造福全人类的事情, 那就是把 Postgres 放在了 BSD 版权的保护下,在这个版权的范围里,任何人几乎可以做任何事情,包括增强它和商业化等。条件只是把 BSD 的版权声明包括在软件的源程序里。

Postgres 在 1989 年发布了第一个版本,因为是BSD版权,所以很快在各种研究机构和一些公众服务组织里广泛使用起来, 由于 众多用户使 Postgres 的开发变得更多地是维护代码和打补丁,而日益背离了原先的数据库管理系统的研究的目标, 到了1994年 Postgres 在版本 4.2 的时候正式终止。而 Postgres 的许多成果则转化成一个商业公司 Illustra,后来 Illustra 被 Informix 收购。看到这里,想必大家应该对 Postgres 的影响有一些认识了吧。

3.4 炎黄子孙的贡献 Postgres95

Postgres 并没有因为 Postgres 项目的终止而停止发展,而是获得了一次新生:在1994年,两名伯克利的研究生在做研究生课题的时候, 向 Postgres 里增加了现代的 SQL 语言的支持。请不要奇怪,SQL 的祖宗是 E.F. Codd 的关系模型,但是 SQL 作为语言,一直到1992年 才形成真正的国际标准(还是草案),当时称为 SQL2,但是人们常称为 SQL92。而在那之前,所以查询语言都是由不同的数据库管理系统 自己实现的,比如,在 Postgres 里原来是用叫 Postquel 的查询语言;这两位研究生是 Andrew Yu 和 Jolly Chen,看了名字,大家可能会想:“很象中国人的名字嘛”,没错,他们就是黑头发黄皮肤的炎黄子孙,不过很可惜的是他们并没有在中国的(包括台湾省的)xx大学取得这样的成就。这样,Postgres 迎来了 1995年,大概 是受xxxxxxx95 的命名方法的“启发”吧,他们俩把这个版本的 Postgres 命名为 Postgres95,并且继续发布了几个版本,增强了一些特性。

3.5 国际化 PostgreSQL

到了 1996 年,Andrew Yu 和 Jolly Chen 相继离开 Postgres95 的开发队伍,(Andrew Yu 加入了 Informix, Jolly Chen 继续读书),而在一些自由软件黑客(注1)的发起下,Postgres 项目又开始了新的历程,最先是由几位加拿大黑客发起,开始了 PostgreSQL 项目,后来参与的人越来越多,逐渐成为了一个由近20个国家的近四十名黑客组成的团体共同开发的 自由软件项目。PostgreSQL 重新把版本号放到了原先 Postgres 项目的顺序中去,从 6.0 开 始(Postgres 本身到4.2,Postgres95 算5.0)。经过五年多的协作开发,PostgreSQL 可以说是目前世界上最先进,功能最强大的自由软件的数据库管理系统。

目前,PostgreSQL 的稳定版本到了 7.3,具有非常丰富的特性和商业级数据库管理系统的质量。而即将到来的 7.4 版本又将是一次飞跃, 将向高质量大型数据库管理系统的方向又迈进了一步。

在这里,先让我告诉您怎么念 PostgreSQL (的确很绕口):Post-gres-Q-L,大概因为大多自由软件开发人员把 SQL 念做:S-Q-L,而不是 IBM 常说的(squel)。

4. 特点

PostgreSQL 可以说是最富特色的自由数据库管理系统,甚至我们也可以说是最强大的自由软件数据库管理系统。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。直到最近才有 Inprise 的 InterBase 以及 SAP 等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,目前的提交人员已经超过三十人, 而且在许多黑客的努力下,PostgreSQL 的质量日益提高,也从另外一个侧面上增加了人们使用 PostgreSQL 的信心,毕竟数据库管理系统不能象桌面操作系统那样 一天宕一次还让人觉得挺满意 :-P。

从技术角度来讲,PostgreSQL 采用的是比较经典的 C/S (client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式, 这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写, 由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如 ODBC,JDBC,Python,Perl ,Tcl,C/C++,ESQL 等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。

说完优点,不能不说几句缺点,不能因为是自由软件而偏袒 PostgreSQL,从 Postgres 开始,PostgreSQL 就经受了多次变化。

首先,早期的 PostgreSQL 继承了几乎所有 Ingres, Postgres, Postgres95 的问题:过于学院味,因为首先它的目的是数据库研究,因此不论在稳定性, 性能还是使用方便方面,长期以来一直没有得到重视,直到 PostgreSQL 项目开始以后,情况才越来越好,目前,PostgreSQL 已经完全可以胜任任何中上规模范围内的应用范围的业务。目前有报道的生产数据库的大小已经有 TB 级的数据量,已经逼近 32 位计算的极限。 不过学院味也给 PostgreSQL 带来一个意想不到的好处:大概因为各大学的软硬件环境差异太大的缘故,它是目前支持平台最多的数据库管理系统的一种, 所支持的平台多达十几种,包括不同的系统,不同的硬件体系。至今,它仍然保持着支持平台最多的数据库管理系统的称号。

其次,PostgreSQL 的确还欠缺一些比较高端的数据库管理系统需要的特性,比如联机热备份,数据库集群,更优良的管理工具和更加自动化的系统优化功能 等提高数据库性能的机制等。

但是,话说回来,PostgreSQL 拥有极其强大的扩展能力,你可以很容易地扩展数据类型,内部函数,聚集,操作符等等,而且,别忘了,你拥有所有的源程序, 理论上你可以做任何你可以做的事情。因此,很多缺点,在转瞬之间就会消失也是很正常的。

总而言之,PostgreSQL的特性已经完全可以满足绝大部分用户的需要,而且其质量和特性仍然在日新月异地进步着,所以, 我们有理由相信在不远的将来,PostgreSQL 肯定能够成为一种优秀的,自由的,商业数据库的替代产品。

5. 人物

对 PostgreSQL 做出巨大贡献的人物太多了,我在这里只能摘其一二而为之,

首先是伯克利,作为一个学院,好象不应该进入人物的范畴,但是如果没有 BSD 的优良的学术环境,创造出这样优秀的科学技术成果是不可能的, 只要想想我们的 5000 多所科研单位就能明白。(我是不是应该还要在这里感谢美国?:-P)。

然后是 Michael Stonebraker 教授,正是这位学究的开明才能让这样优秀的科技成果走向了公众,甚至到了“自由的对立面”的我们的手里, 而且是所有的东西,不仅仅是一堆二进制文件。

接下来有我们的同胞,Andrew Yu 和 Jolly Chen,他们为 PostgreSQL 走向现代做出了巨大的贡献。

最后是现在正在辛勤耕耘的黑客们,这些黑客以他们执着的精神和高超的技术,为 PostgreSQL的日益完善做出了不可磨灭的贡献。 黑客总共有数十人之多,我只好把核心成员挑出来介绍一下,而对于贡献了更多代码的其他重要黑客,只好暂且委屈他们一阵子了,如果有机会,我还会进一步介绍他们。

5.1 Tom Lane:

一位卡耐基梅隆大学(CMU)的电子工程学 ph.D(博士),是 PostgreSQL 的非常重要开发人员,其足迹遍部PostgreSQL 的每一个角落, 可以说对 PostgreSQL 的性能和稳定性以及特性的取舍有极其重要的贡献,在开始参加 PostgreSQL 项目之前,他已经有了十余年的自由软件开发经验, 可以说是老牌的自由软件程序员;

5.2 Vadim Mikheev:

一位来自俄国的黑客,其特点是专干大项目,比如 V6.3 里面的子查询,V6.5里面的多版本并行控制,以及 7.1 里面的预写式日志系统等, 可以说是 PostgreSQL 的开拓者;

5.3 Jan Wieck:

一位来自德国的黑客,有十余年的数据库开发经验,原先曾经为 SAP 等大型软件厂商工作,后来加入 PostgreSQL 的开发;他也是喜欢大项目, 不过兴趣是用户端的特性,比如外键,一些过程语言比如 pl/pgsql 等,7.1 版本中的 CLOB(文本大对象)的部分也是他的作品。

5.4 Thmas Lockhart:

一位毕业于加洲理工学院的美国黑客,主要负责文档和若干种数据类型(尤其是与时间相关的类型),SQL 语法的标准一致性,时间类型,以及完整性约束等。

5.5 Bruce Monjian:

来自美国,是一些文档和项目协调,以及许多完整性约束和 SQL 语法的标准等,比如 OUTER JOIN,同时维护 TODO 列表和 FAQ。

5.6 Marc Fournier:

加拿大黑客,主要的协调人,维护站点,邮件列表,以及发布版本等。

5.7 Peter Eisentraut:

德国/瑞典黑客,主要负责文档编写、完善,认证和权限管理,制作脚本和一些管理配置接口的制定,以及客户端交互工具 psql 等, 其作用日益突出,可以说在 7.2 版本的开发过程中是不可或缺的人物。

另外还有大量来自欧洲,澳洲和亚洲(日本)等地的黑客。实际上,有越来越多的黑客的作用变得日益重要,在邮递列表中每天都有来自不同黑客的 各种各样的补丁程序。所以,自由软件的特点就是,只要愿意,任何人都可以对它有足够的影响。也就是说,我们命运是真正掌握在自己手里的。

6. 展望

就目前而言, PostgreSQL 的前景非常好,目前的稳定版本是 7.3,这个版本在 7.2 版本的基础上再次做了大量的改进和提高。

7.1 是继 6.5 之后的又一个巨大的变化,她首先引入了预写式日志的功能。这样,事务就拥有了完善的日志机制,可以提供更好的性能, 以及还可以实现更优良的备份和灾难恢复的能力(比如联机热备份和宕机后的自动恢复)。其次是对文本类型的数据段的长度不再限制, 从而很大程度上解决了 PostgreSQL 的大对象的问题。尤其在如今的 web 应用盛行的环境下,这个功能几乎立即将 PostgreSQL 摆到了 可以与其他所有类型的数据库竞争的地位。而且在 SQL 标准上又有进一步的提高,比如 OUTER JOIN 的支持等等。

7.2 版本在 7.1 的基础上改进了原来的数据库定期清理工作中排它锁的过程,使数据库维护不再影响数据库的正常使用,同时增强了查询优化的智能, 使数据库对索引的使用更加准确;同时还消除了每个安装节点的免维护事务次数的限制;国际化;以及还有大量其他方面的增强。

7.3 版本在 7.2 版本的基础上,继续增强了许多特性,包括可返回结果集的用户函数,模式(schema)的支持,准备好的查询规划,DROP COLUMN 的支持, 以及vacuum的优化,更好的查询计划器,更好的权限管理系统等。7.3 版本在许多现实项目中得到了充分的证明和大量的应用。标志着 PostgreSQL 正式成为主流数据库产品之一。

在未来的 7.4 版本中,我们有望可以看到索引空间的重复利用,优化了的 IN 子句(大家不用为 IN 恶劣的性能发愁了),新的前后端协议,更优的聚集函数。 甚至还可能提供 windows 的本机移植版本和具有相当的热备份功能的 PITR (即时恢复)和很多人期待已久的表空间的功能。可以说 7.4 将是一个完全胜任 7x24 应用需求的真正的高端数据库,一个具有开拓企业级应用的数据库。我们有什么理由不欢呼呢?

7.后记

作为一种数据库管理系统,PostgreSQL 并不象 Linux 与某些商业操作系统相比那样,得到迅速广泛的承认,这一点是可以理解的,Tom Lan 曾经有一段话说得实在: “首先,商业数据库系统不象某些商业操作系统那样实在太烂,相反,商业数据库系统的质量还是非常高的,与之相比,PostgreSQL 仍然有一定差距”但同时他也相信 “我们已经达到商业级的数据库系统的质量......”

的确,自由软件的发展具有跳跃性,因为开发者大多是利用空余时间进行开发,当开发者云集的时候,新的东西可能一下子就增加上去;而如果在自由软件运动的低潮时, 因为缺少开发人员,所以可能会有一长段时间的沉寂,而后又会随着社会的发展而出现新的活动。也就是一种螺旋的上升。

因而,我们在面对自由软件的时候,一定要有一点:要相信自己和依靠自己,因为自由软件的发展的确需要每一个爱好者充分发挥自己的聪明才智, 同时,也只有自由软件给你提供了这样的机会——依靠自己的力量改变自己的命运。最后,也只有这样,自由软件之光才能真正照耀我们的世界。

8. 附录

8.1 参考资料

8.2 历史

http://www.daemonnews.org/199907/devhistory.html

http://www.postgresql.org/osdn/history.pdf

http://www.postgresql.org/osdn/tour.pdf

8.3 特性

http://www.postgresql.org/idocs/

http://www.pgsqldb.com/pgsqldoc-7.2c/index.html

9. 注释:

本文中黑客一词源于英文 Hacker,是指那些计算机尖子,对计算机及全人类都有贡献的创造者, 不是一般媒体上的“黑客” 概念,那是指 Cracker,也就是破坏者。

 

作者:何伟平 laser(at)pgsqldb(dot)org laser(at)zhengmai(dot)com(dot)cn

注:如要转载请注明作者和出处 www.pgsqldb.org 或 laser.zhengmai.com.cn

远程连接PostgreSQL服务器。

众所周知,Postgres 8.1 分别发行了 Linux和Windows 两个版本,

所以,介绍远程连接的主题时,也是分别介绍这两个系统上是如何实现的。

其实,windows版比linux版的步骤少一些。

一、实现远程连接Linux上的PostgreSQL服务器。

主要分两个步骤:

<1>要使Linux上的PostgreSQL打开 “unix的tcpip套接子”。

编辑 $POSTGRES/data/postgresql.conf 文件,

将tcpip_socket=off改成tcpip_socket=on即可。

<2>设置远程访问认证机制。

编辑 $POSTGRES/data/pg_hba.conf 文件,

这个文件上面一大堆都是介绍如何使用这个文件使进行配置的,

最下面才是真正让我们填写东西的地方。

其中,有一行注释:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

说明每一行有五个字段,

分别是:连接类型、可使用的数据库名、使用者、DIDR地址、和验证方法等五项。

下面,我只介绍一些针对每个字段常用的选项。

字段一:TYPE。

可以选择:local或host。

前者只能允许本地的用户登陆Postgres数据库;后者可以接受远程客户登陆。所以,

我们应该使用“host”。

字段二:DATWABSE。

连接用户可以使用的数据库名字。可以使Postgres的一个具体的

数据库名,也可以使用“all”来允许用户访问所有数据库。

字段三:USER。

可以指定某个具体的用户来连接Postgres数据库(还要结合后面的地址字段),

也可以使用“all”来允许所有用户连接数据库。

字段四:DIDR-ADDRESS。

这可能会让您不知所措,不知道它为何物。

其实,它就是IP地址与掩码的另一种表示方法而已。

Postgres是通过这个字段来了解,允许那些IP或IP网段连接此服务器。

它的格式是: IP地址/掩码。

这个掩码和子网掩码是一个道理,只不过是用一个小于等于32的正数来表示,

表示的正是子网掩码中高几位为1,

比如,255.255.255.0 就是“24”,说明高24位是1。

192.168.0.1/32 相当于 IP为192.168.0.1,子网掩码为255.255.255.255的网段,

很显然,这只表明192.168.0.1IP自己。

如果您对IP地址与子网掩码不太了解,请查看相关资料。

字段五:METHOD。

这是验证方法。可选的有:

reject:拒绝这个IP的用户访问;

md5:密码以md5作为hash编码;

password:密码作为明文传输(好恐怖!);

krb5:密码以krb5作为hash编码。

下面举一个例子,来说明如何进行设置:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

#允许IP为192.168.0.1的所有用户登陆到Postgres服务器的所有数据库,采用md5验证。

host      all                 all            192.168.0.1/32          md5

#允许用户testuser在192.168.0.XX的网段任意机器登陆Postgres服务器,

#只能使用数据库testdb,采用md5验证。

host      testdb           testuser 192.168.0.1/24          md5

==============================================

二、实现远程连接Windows上的PostgreSQL服务器。

前面都已经看懂后,这个配置就很简单了,除了上面介绍的步骤<1>不用修改后,

只需要配置步骤<2>中介绍的东西即可。(因为winodws不会存在unix的tcpip套接子)。