文档库 最新最全的文档下载
当前位置:文档库 › 深入学习PostgreSQL事务功能之PHP篇

深入学习PostgreSQL事务功能之PHP篇

深入学习PostgreSQL事务功能之PHP篇
深入学习PostgreSQL事务功能之PHP篇

在上一篇文章中,我们介绍了PostgreSQL的事务功能的定义,并讲解如何通过PostgreSQL客户端进行事务处理。而在本文中,我们将介绍如何在自己的PHP应用程序中如何使用事务。

一、概述

给我们的PHP应用程序集成PostgreSQL的事务功能并非什么难事,只要在适当的时间启动事务,然后当所有操作都完成的时候提交事务或者回滚就行了。下面我们介绍利用PHP进行事务处理的一般方式。通过这个示例程序,能够帮您熟悉为应用程序集成事务功能的一般过程。

二、创建PostgreSQL类

虽然PostgreSQL为PHP提供了相应的函数库,但是您最好不要直接从自己的脚本中调用这些函数,相反地,您应该将它们封装到一个类中,然后使用这个类与数据库进行交互,其中清单1提供了一个这样的类,它实现了我们所需的一些基本功能。

清单1 PostgreSQL的数据层类(pgsql.class.php)

class pgsql {

private$linkid;//PostgreSQL连接标识符

private$host;//PostgreSQL服务器主机

private$user;//PostgreSQL用户

private$passwd;//PostgreSQL密码

private$db;//Postgresql数据库

private$result;//查询的结果

private$querycount;//已执行的查询总数

/*类构造函数,用来初始化$host、$user、$passwd和$db字段。*/

function__construct($host,$db,$user,$passwd) {

$this->host=$host;

$this->user=$user;

$this->passwd=$passwd;

$this->db=$db;

}

/*连接Postgresql数据库*/

function connect(){

try{

$this->linkid=@pg_connect("host=$this->host dbname=$this->db

user=$this->user password=$this->passwd");

if(!$this->linkid)

throw new Exception("Could not connect to PostgreSQL server.");

}

catch(Exception$e) {

die($e->getMessage());

}

}

/*执行数据库查询。*/

function query($query){

try{

$this->result=@pg_query($this->linkid,$query);

if(!$this->result)

throw new Exception("The database query failed.");

}

catch(Exception$e){

echo$e->getMessage();

}

$this->querycount++;

return$this->result;

}

/*确定受查询所影响的行的总计。*/

function affectedRows(){

$count=@pg_affected_rows($this->linkid);

return$count;

}

/*确定查询返回的行的总计。*/

function numRows(){

$count=@pg_num_rows($this->result);

return$count;

}

/*将查询的结果行作为一个对象返回。*/

function fetchObject(){

$row=@pg_fetch_object($this->result);

return$row;

}

/*将查询的结果行作为一个索引数组返回。*/

function fetchRow(){

$row=@pg_fetch_row($this->result);

return$row;

}

/*将查询的结果行作为一个关联数组返回。*/

function fetchArray(){

$row=@pg_fetch_array($this->result);

return$row;

}

/*返回在这个对象的生存期内执行的查询总数。这不是必须的,但是您也许会感兴趣。*/

function numQueries(){

return$this->querycount;

}

}

?>

借助于我们提供的详细注释,清单1中的代码还是很容易理解的。然而,您可能已经注意到了一个问题,那就是异常的输出。为简单起见,我们使用了一个die()语句来输出与数据库服务器连接有关的异常;可是,失败的查询是不会被返回的。这个实现可能无法满足您的特殊需要,但是我们这里只是用于演示而已。

当然,为了演示事务处理功能,我们PostgreSQL类还需另外再添加五个事务相关的方法:Begintransaction()、commit()、rollback()、setsavepoint()和rollbacktosavepoint()。通过阅读上一篇文章对事务知识的介绍,现在读者对于下面代码的理解应该不成问题了。

function begintransaction() {

$this->query('START TRANSACTION');

}

function commit() {

$this->query('COMMIT');

}

function rollback() {

$this->query('ROLLBACK');

}

function setsavepoint($savepointname){

$this->query("SAVEPOINT $savepointname");

}

function rollbacktosavepoint($savepointname){

$this->query("ROLLBACK TO SAVEPOINT $savepointname");

}

因为这些命令通常不会出错,所以我们没有引入异常处理,从而使我们的示例代码更加简洁。

三、pg_query()函数

函数pg_query()的运转稍微有些复杂,如果不全面理解其行为的话,就有可能对我们的事务逻辑造成严重的影响。这主要是pg_query()确定成功和失败的方式所引起的。当pg_query()被调用时,任何成功执行的查询都会返回一个资源标识符。这看起来是并没什么,但是别忘了:一次成功的查询并不意味着一切搞定。举例来说,假如您执行下列命令:

$query="UPDATE participant SET name='Treat'WHERE name='Rob'";

echo pg_query($query);

根据之前插入的测试信息,这次查询没有更新任何数据,因为通过名字Rob不会显示任何参与者。然而,pg_query()仍然会煞有介事地向您返回一个资源标识符,因为这次查询是有效的。但是这对事务来说却是一个大问题,因为您需要明确地知道是否真输出了预期的内容。为了正确处理该事务,我们需要同时检查查询的正确运行情况和是否有数据受到影响。为此,我们可以使用pg_affected_rows()函数来达此目的。举例来说,我们可以像下面这样来改写代码,以确定该查询是否有效,以及是否有数据受到了影响,如下所示:

$query="UPDATE particpant SET name = 'Treat' WHERE name = 'Rob'";

$result=pg_query($query);

if($result AND pg_affected_rows($result)==1) echo"TRUE";

else echo"FALSE";

这将返回FALSE。这是结合PHP使用PostgreSQL数据库的事务的关键,所以我们将在下面的示例中加以详解。

四、利用PHP进行事务处理

在本例中,我们将重新创建前面的商品交换应用,这一次我们将使用PHP。为了简单起见,我们省略了许多无关的细节,这个页面将显示一个产品,并提示用户向他的购物车添加商品,如下所示:

ComputerABC

Owner:Jack

Price:$12.99

A book about computer!


你可想而知,在这个页面中显示的数据可以简单地从participant和trunk表中提取。在浏览器中刷新后,这个页面将变成图1的样子。

图1 典型的产品展览

单击Purchase! 按钮将把用户带至purchase.php脚本。同时,还会传递一个变量,即

$_POST['itemid']。通过使用这个变量连同一些假定的检索交易方和商品主键的类方法,我们可以利用PostgreSQL的事务来给数据库添加产品,并对交易双方账户中的现金进行相应的增减处理,如清单2所示。

清单2 借助purchase.php交易商品

session_start();

include"pgsql.class.php";

//使用引用某种用户会话表的虚构类来检索参与方的主键,并将会话id映射到一个特定用户$participant=new participant();

$buyerid=$participant->getparticipantkey();

//给商品id取一个友好的变量名

$itemid=$_POST['itemid'];

//使用虚构的item类来检索商品的卖家和价格

$item=new item();

$sellerid=$item->getitemowner($itemid);

$price=$item->getprice($itemid);

//实例化pgsql类

$pgsqldb=new pgsql("localhost","company","webuser","secret");

//连接到PostgreSQL数据库

$pgsqldb->connect();

//假设事务操作会完全成功

$transactionsuccess=TRUE;

//启动该事务

$pgsqldb->begintransaction();

//从买方账户扣款

$query="UPDATE participant SET cash=cash-$price WHERE participantid=$buyerid";

$result=$pgsqldb->query($query);

if(!$result OR$result->affectedrows()!=1)

$transactionsuccess=FALSE;

//向卖家的账户打款

$query="UPDATE participant SET cash=cash+$price WHERE participantid=$sellerid";

$result=$pgsqldb->query($query);

if(!$result OR$result->affectedrows()!=1)

$transactionsuccess=FALSE;

//更新商品的属主

$query="UPDATE trunk SET participantid=$buyerid WHERE trunkid=$itemid";

$result=$pgsqldb->query($query);

if(!$result OR$result->affectedrows()!=1)

$transactionsuccess=FALSE;

//如果$transactionstatus为True,则提交该事务

//否则,回滚所做修改

if($transactionsuccess) {

$pgsqldb->commit();

echo"The swap took place! Congratulations!";

}else{

$pgsqldb->rollback();

echo"There was a problem with the swap! :-(";

}

?>

如您所见,运行事务的每一步骤之后都会对查询的状态和受影响的数据记录进行检查。任何时候,只要发现出现错误,$transactionsuccess就会被设为FALSE,并且在该脚本结束时回滚所有步骤。当然,您可以优化这个脚本,让它以步步为营的方式启动各个查询,使得只有在确定前一个查询已正确执行之后才会再进行下一个查询,当然,这项练习就留给您自己了。

五、使用事务的注意事项

使用事务时,有许多事项需要注意,例如:

1、只有当整个过程都必须全部成功时才有必要使用事务。举例来说,向购物车添加产品是一个关键的过程,但是浏览可用的产品则不是。

2、PostgreSQL允许您回滚数据定义语句,即任何用于创建、修改或者丢弃一个数据库对象的语句,这里所说的数据库对象包括表、索引、触发器、函数、视图,等等。

3、事务不能嵌套。在COMMIT或者ROLLBACK命令之前提交多个START TRANSACTION命令是没有效果的。然而,您却可以使用保存点来取得嵌套事务所提供的功能。

六、结束语

在上一篇文章中,我们介绍了PostgreSQL的事务功能的定义,并讲解如何通过PostgreSQL客户端。读者通过阅读本文,将会学习什么是事务,PostgreSQL是如何实现它们的。在本文中,我们将介绍如何在自己的PHP应用程序中如何使用事务。当为商务过程建模的时候,数据库的事务功能极为有用,因为它能确保信息的完整性,而这些信息则是组织内最有价值的资产之一。当建立数据库驱动的应用程序的时候,谨慎的使用数据库的事务功能将为您带来巨大的好处。

PostgreSQL安装和简单使用

PostgreSQL安装和简单使用 PostgreSQL安装和简单使用 作者:小P 来自:https://www.wendangku.net/doc/fc1622462.html, 摘要:PostgreSQL是现在比较流行的数据库之一,这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。据我了解国内四大国产数据库,其中三个都是基于PostgreSQL开发的。并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发PostgreSQL,不管是私用,商用,还是学术研究使用。本文只是简单介绍一下postgresql的安装和简单的使用,语法方面涉及的比较少,以方便新手上路为目的。目录1.系统环境及安装方法;1.1 系统环境; 1.2 安装; 2.启动PostgreSQL 数据库服务器;2.1 在流行Linux发行版的启动方法; 2.2 关于PostgreSQL启动和存储目录; 3.创建用户;3.1 添加用户; 3.1.1 不带参数的创建用户; 3.1.2 为指定的主机和端口上创建用户; 3.1.3创建超级用户; 3.2 删除用户:3.2.1 删除本地的Postgres用户;

3.2.2 删除远程Postgres服务器上的用户; 4. 创建和删除数据库;4.1创建数据库 4.2 删除数据库 5.访问数据库5.1 激活数据库 5.2 帮助和退出数据库 6. Postgresql图形化管理工具pgAdmin3 ;6.1 安装;6.1.1 Ubuntu安装; 6.1.2 其它系统的安装;6.2 pgAdmin3的简单使用;6.2.1 pgAdmin3的启动; 6.2.2 连接已创建的数据库mydb ; 7. 创建和删除表;7.1 创建新表; 7.2 数据类型; 7.3 删除表;8. 向表中添加行;8.1 INSERT; 8.2 point类型输入; 8.3 COPY;9. 查询一个表;9.1 SELECT; 9.2 WHERE; 9.3 排序;10. 视图; 11. 更新行; 12. 删除行; 13. 关于本文; 14. 更新日志; 15. 参考文档; 16. 相关文档; +++++++++++++++++++++++++++++++++++++++++++

监视并记录Apache网站服务器的运行

监视并记录Apache网站服务器的运行 LogFormat 指令承诺你告诉Apache你想要记录要求的哪些方面。而你仍需附加的指令来告诉Apache在哪里记录那些信息,这在下一章中将会介绍。下面的例子显示了两种最受欢迎的格式的配置:一般日志格式和整合日志格式。当Apache收到一个要求,他将会用相应的要求属性来替代以%为前缀的每一个域。假如您正在使用一般日志格式,您的日志文件里 尽管有附件提供日志格式的详尽索引,下表描述了一些最为重要的域: # %h: 客户端(例如,扫瞄器)向服务器发出连接要求时自己的当时的IP地址或域名(需开启HostNameLookups)。 # %u: 使用方式认证用户时,记录下的用户的编号。 # %t: 服务器同意到连接要求的时刻。 # %r: 客户端发出的原始连接要求中的文本信息,包含所使用的方法。 # %>s: 服务器应答扫瞄器后的返回状态代码,200表示要求成功。. # %b: 服务器应答扫瞄器发出的单个要求的回传对象的内容大小(字节为单位),不统计数据包头部字节。 整合日志格式在一般日志格式的基础上扩展出了两个附加的域。定义为: # %{Referer}i: 连接要求数据包包头,包含指向当前页面的文档关联信息。 # %{User-agent}i: 用户代理连接要求数据包包头,包含客户扫瞄器的信息。 创建一个自定义日志文件 您可能会想创建Apache自带以外的新的日志文件。下面的例子将运用CustomLog来创建一个新的日志文件,并储存由一个之前定义好的日志格式,即前一章提到的common,所定义的信息。您还能够用格式本身的定义来替换昵称。一个附加的,更为简单的指令是Transferlog,它只同意最后一个LogFormat指令提供的定义。

PostgreSQL数据库使用pg_dump—psql 转储数据库

使用pg_dump/psql转储数据库 pg_dump/psql应用程序在pg安装目录的bin目录下。 只要在安装pg数据库的服务器上,且能够连通远程pg数据库,都可以实现数据导出。 一、pg_dump导出 pg_dump –h hostname –U name –p port –d database –f “file_name” -h: 数据库服务器地址 -U: 大写的U,用户名 -p: 端口号 -d: 数据库名 -f: 存储的文件路径和名称 pg_dump -h 110.84.129.40 -U postgres -p 3306 -d O2O -f "/home/wsxcde/database_file/O2O_bak_140430.dmp" 回城执行,会要求输入密码,正确,即可导出,没有进度条 远程导出300M的文件,大概时间10分钟。 以上命令是导出数据的全部对象,包括数据,对象(index,table,sequence,function等),但不包括blob的大对象,如果要导出大对象,要加上“-b”。 二、psql数据导入 psql –h localhost –U postgres –d new_db –f "xxx.dmp" -h: 数据库服务器地址,如果导入本机,直接使用localhost -U:大写的U,被导入数据库的用户名 -d: 数据库名,想导入的数据库,导入前请检查此数据库是否存在,不存在会报错 -f: 备份文件dmp的来源 psql–h localhost –U postgres –d O2O –f "/home/wsxcde/database_file/O2O_bak_140430.dmp" 300M的文件,导入时间不大约10多秒。

PostgreSQL+Linux 从入门到精通培训文档 2命令

本章大纲 1. 如何访问命令行 2. 使用命令行下的工具 非编辑模式 进入编辑模式 3. 正则表达式、管道和I/O 重定向 4. 管理用户账户 5. 文件访问控制 6. 管理进程 1,如何访问命令行 1.1 本地命令行的访问 在图形界面中,访问命令行的方法:打开Terminal,Console。或者:Ctrl+Alt+F1 ~ F6 1.2 使用SSH 访问命令行 同上 2,使用命令行下的工具 2.1 使用硬链接

硬链接,指在同一个文件系统中,对inode的引用,只要文件上存在至少1个硬链接,就可以找到对应的inode。 [digoal@digoal01 ~]$ echo "abc" > ./a [digoal@digoal01 ~]$ stat a File: `a' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 1 -- 硬链接数量 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:14.292848716 +0800 创建硬链接 [digoal@digoal01 ~]$ ln -L ./a ./b [digoal@digoal01 ~]$ stat a File: `a' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:34.631855044 +0800 [digoal@digoal01 ~]$ stat b File: `b' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:34.631855044 +0800 删除一个硬链接,还能通过其他硬链接找到对应的inode。 [digoal@digoal01 ~]$ rm a rm: remove regular file `a'? y [digoal@digoal01 ~]$ cat b abc 2.2 归档和解压 常用的归档命令tar 归档-c (常用压缩库-j bz2, -z gzip) [digoal@digoal01 ~]$ tar -jcvf test.tar.bz2 b

PostgreSQL详解

PostgreSQL数据库 一:PostgreSQL介绍 1、PostgreSQL就是以加州大学伯克利分校计算机系开发得 POSTGRES,现在已经更名为POSTGRES,版本 4、2为基础得对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其她现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新得数据类型、函数、操作符、聚集函数、索引方法、过程语言。并且,因为许可证得灵活,任何人都可以以任何目得免费使用、修改、与分发PostgreSQL,不管就是私用、商用、还就是学术研究使用。 2、PostgreSQL图标 3.PostgreSQL优点 有目前世界上最丰富得数据类型得支持支持,其中有些数据类型可以说连商业数据库都不具备,具体类型下文会说明、 PostgreSQL拥有一支非常活跃得开发队伍,而且在许多黑客得努力下,PostgreSQL 得质量日益提高 PostgreSQL 对接口得支持也就是非常丰富得,几乎支持所有类型得数据库客户端接口。这一点也可以说就是 PostgreSQL 一大优点。 4.PostgreSQL缺点 首先,早期得 PostgreSQL 继承了几乎所有 Ingres, Postgres, Postgres95 得问题:过于学院味,因为首先它得目得就是数据库研究,因此不论在稳定性, 性能还就是使用方方面面,长期以来一直没有得到重视,直到 PostgreSQL 项目开始以后,情况才越来越好,PostgreSQL 已经完全可以胜任任何中上规模范围内得应用范围得业务 其次,PostgreSQL 得确还欠缺一些比较高端得数据库管理系统需要得特性,比如数据库集群,更优良得管理工具与更加自动化得系统优化功能等提高数据库性能得机制等。 5.目前官方最新版本:9、3、2 二、windows下安装过程 1、开始安装:

PostgreSql 基础知识

PostgreSql 常见数据类型 1.CREATE TYPE命令增加新的数据类型 2.数据类型

3.数值类型 3. 整数类型 smallint, integer, bigint 类型存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。 常用的类型是 integer ,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 。而只有在 integer 的范围不够的时候才使用 bigint ,因为前者绝对快得多。 bigint 类型可能不是在所有平台上都运转正确,因为它依赖编译器对八字节整数的支持。在那些没有八字节整数支持的机器上,bigint 的作用和 integer 一样(但是仍然占据八字节存储)。不过,我们目前还没听说过有这样的平台。 SQL 只声明了整数类型 integer(或 int) 和 smallint 。类型 bigint 和类型别名 int2, int4, int8 都是扩展,并且也在许多其它 SQL 数据库系统中使用。 4.任意精度数值 numeric 类型可以存储最多 1000 位精度的数字并且准确地进行计算。特别建议将它用于货币金额和其它要求精确计算的场合。不过,numeric 类型上的算术运算比整数类型要慢很多。 术语:一个 numeric 类型的标度(scale)是小数部分的位数,精度(precision)是全部数据位的数目,也就是小数点两边的位数总和。因此数字 23.5141 的精度为 6 而标度为 4 。你可以认为整数的标度为零。 numeric 字段的最大精度和最大标度都是可以配置的。要声明一个字段的类型为 numeric ,你可以用下面的语法: NUMERIC(precision, scale) 精度必须为正数,标度可以为零或者正数。另外, NUMERIC(precision) 选择了标度为 0 。不带任何精度与标度的声明 NUMERIC 则创建一个可以存储一个直到实现精度上限的任意精度和标度的数值,一个这样类型的字段将不会把输

PostgreSQL数据库安装教程

PostgreSQL数据库安装教程 (仅供参考) 最新更新:2014年08月27日 深圳市恩布网络科技有限公司 (内部技术文档)

目 录 1. Linux安装PostgreSQL数据库 (3) 1.1. 概述 (3) 1.2. 新建postgres用户和目录 (3) 1.3. 配置postgres用户的环境变量: (3) 1.4. yum安装 (3) 1.5. 初始化数据库目录 (3) 1.6. 给postgres赋予权限 (4) 1.7. 配置监听地址、端口 (4) 1.8. 配置支持远程连接 (4) 1.9. 设置开机启动 (4) 1.10. 启动服务 (4) 1.11. 修改postgres帐号密码 (4) 2. Windows安装PostgreSQL数据库 (5) 2.1. 概述 (5) 2.2. 安装 (5) 2.3. 配置监听地址、端口 (5) 2.4. 配置支持远程连接 (5) 3. 注意事项 (6) 4. 附录一:PostgreSQL数据库介绍 (6) 5. 附录二:PostgreSQL与MySQL比较 (6)

1.Linux安装PostgreSQL数据库 1.1.概述 以CentOS 6.4(或以上)X64(64位)版本,PostgreSQL8.4为例子说明。 本文仅供参考,如果安装不成功,或需要更多PostgreSQL技术资料,请自行上网搜索; 1.2.新建postgres用户和目录 mkdir /var/lib/pgsql groupadd postgres useradd ‐g postgres postgres 1.3.配置postgres用户的环境变量: cat >>/var/lib/pgsql/.bash_profile<

odbc安装文档

Linux/Unix下ODBC的安装 方法一: 先下载最新的unixODBC源码包(https://www.wendangku.net/doc/fc1622462.html,/unixODBC-2.2.1.tar.gz)放到/usr/local下,然后运行下述命令: 安装成功后,unixODBC所需的头文件都被安装到了/usr/inlucde下,编译好的库文件安装到了/usr/lib下,与unixODBC相关的可执行文件安装到了/usr/bin下,配置文件放到了/etc下。 方法二: 下载rpm包进行安装,我们这里以Red Hat 7.3为例: unixODBC-2.2.0-5 RPM for i386(安装包及源码包) (ftp://https://www.wendangku.net/doc/fc1622462.html,/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-2 .2.0-5.i386.rpm、 ftp://https://www.wendangku.net/doc/fc1622462.html,/linux/redhat/7.3/en/os/i386/SRPMS/unixODBC-2.2.0-5.src.rpm)unixODBC-devel-2.2.0-5 RPM for i386 (ftp://https://www.wendangku.net/doc/fc1622462.html,/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-d evel-2.2.0-5.i386.rpm) 直接将unixODBC-2.2.0-5.i386.rpm和unixODBC-devel-2.2.0-5.i386.rpm装入系统就可以了,命令如下:

Linux/Unix下ODBC的配置 运行ODBCConfig程序(在/usr/bin下),如下图: 图一:ODBCConfig主窗口 和Windows下的ODBC设置窗口是不是很像?我想大家都能看懂吧。 第一步:安装数据库的ODBC驱动程序 Drivers这一栏中用来设置数据库的驱动程序,点击Add按钮,会出现下图:

psql常用命令大全

psql常用命令大全 \d [ table ] 列出数据库中的表,或(如果声明了)表table 的列/字段.如果表名是用统配符(“*”)声明的,列出所有表和表的列/字段信息. \da 列出所有可用聚集. \dd object 列出pg_description 里对声明的对象的描述,对象可以是一个表,表中的列/字段,类型,操作符或聚集. 小技巧:并非所有对象在pg_description 里有描述.此后期命令在快速获取Postgres 内部特性时很有用. \df 列出函数. \di 只列出索引. \do 只列出操作符. \ds 只列出序列. \dS 列出系统表和索引. \dt 只列出非系统表. \dT 列出类型. \e [ filename ] 编辑当前查询缓冲或文件filename 的内容. \E [ filename ] 编辑当前查询缓冲或文件filename 的内容并且在编辑结束后执行之. \f [ separator ] 设置域分隔符.缺省是单个空白. \g [ { filename | |command } ] 将当前查询输入缓冲送给后端并且(可选的)将输出放到filename 或通过管道将输出送给一个分离的Unix shell 用以执行command. \h [ command ] 给出声明的SQL 命令的语法帮助.如果command 不是一个定义的SQL 命令(或在psql 里没有文档),或没有声明command ,这时psql将列出可获得帮助的所有命令的列表.如果命令command 是一个通配符(“*”),则给出所有SQL 命令的语法帮助. \H 切换HTML3 输出.等效于-H 命令行选项. \i filename 从文件filename 中读取查询到输入缓冲.

MySQL和PostgreSQL两数据库的对决

MySQL和PostgreSQL两数据库的对决 在这篇文章中,我们选用MySQL4.0.2-alpha与PostgreSQL7.2进行比较,因为MySQL4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。 一、前言 前一段时间,我曾经翻译过一篇将你的网站从MySQL改为PostgreSQL,其实当初我更感兴趣的是一个应用程序的后台数据库从MySQL转为PostgreSQL的具体操作,并没有关心MySQL和PostgreSQL的优劣,没想到反应出乎意料的大,因此我也就觉得有写这篇文章的必要了。 在这篇文章中,我们选用MySQL4.0.2-alpha与PostgreSQL7.2进行比较,因为MySQL4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。 我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。 二、两者的共同优势 这两个产品都属于开放源码的一员,性能和功能都在高速地提高和增强。MySQLAB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择。 三、两者不同的背景 MySQL的背后是一个成熟的商业公司,而PostgreSQL的背后是一个庞大的志愿开发组。这使得MySQL的开发过程更为慎重,而PostgreSQL的反应更为迅速。 这样的两种背景直接导致了各自固有的优点和缺点。 四、MySQL的主要优点 1、首先是速度,MySQL通常要比PostgreSQL快得多。MySQL自已也宣称速度是他们追求的主要目标之一,基于这个原因,MySQL在以前的文档中也曾经说过并不准备支持事务和触发器。但是在最新的文档中,我们看到MySQL4.0.2-alpha已经开始支持事务,而且在MySQL的TODO中,对触发器、约束这样的注定会降低速度的功能也列入了日程。但是,我们仍然有理由相信,

GP 常用数据库命令

Greenplum 日常简明维护手册 1.数据库启动:gpstart 常用参数:-a : 直接启动,不提示终端用户输入确认 -m:只启动master 实例,主要在故障处理时使用 访问单个数据实例: PGOPTIONS='-c gp_session_role=utility' psql template1 -p 5432 启动某个segment instance :pg_ctl stop/start -D /datadir/ 取端口号: select * from gp_segment_configuration 启动以后会在/tmp/ 下生成一个.lock 隐藏文件,记录主进程号。

2.数据库停止:gpstop: 常用可选参数:-a:直接停止,不提示终端用户输入确认 -m:只停止master 实例,与gpstart –m 对应使用 -f:停止数据库,中断所有数据库连接,回滚正在运 行的事务 -u:不停止数据库,只加载pg_hba.conf 和postgresql.conf中 运行时参数,当改动参数配置时候使用。 连接数,重启 3.查看实例配置和状态 select * from gp_segment_configuration order by content ; select * from pg_filespace_entry ; 主要字段说明: Content:该字段相等的两个实例,是一对P(primary instance)和M(mirror Instance) Isprimary:实例是否作为primary instance 运行 Valid:实例是否有效,如处于false 状态,则说明该实例已经down 掉。 Port:实例运行的端口 Datadir:实例对应的数据目录 4.gpstate :显示Greenplum数据库运行状态,详细配置等信息 常用可选参数:-c:primary instance 和mirror instance 的对应关系 -m:只列出mirror 实例的状态和配置信息 -f:显示standby master 的详细信息 该命令默认列出数据库运行状态汇总信息,常用于日常巡检。 5.查看用户会话和提交的查询等信息 select * from pg_stat_activity该表能查看到当前数据库连接的IP 地址,用户

Postgresql存储过程

用PL/pgSQL写postgreSQL的存储过程 一、存储过程结构: Create or replace function 过程名(参数名参数类型,…..) returns 返回值类型as $body$ //声明变量 Declare 变量名变量类型; 如: flag Boolean; 变量赋值方式(变量名类型:=值;) 如: Str text :=值; / str text; str :=值; Begin 函数体; End; $body$ Language plpgsql; 二、变量类型: 除了postgresql内置的变量类型外,常用的还有 RECORD ,表示一条记录 三、连接字符: Postgresql存储过程中的连接字符不再是“+”,而是使用“||”。 四、控制结构: 1、if 条件(五种形式) IF ... THEN IF ... THEN ... ELSE IF ... THEN ... ELSE IF IF ... THEN ... ELSIF ... THEN ... ELSE IF ... THEN ... ELSEIF ... THEN ... ELSE(注:ELSEIF 是 ELSIF 的别名)

2、循环 使用LOOP,EXIT,CONTINUE,WHILE,和 FOR 语句,可以控制PL/pgSQL 函数重复一系列命令。 1)、LOOP [ <

greenplum基本操作及管理命令

第1章系统管理 1.1 GP服务启停 su - gpadmin gpstart #正常启动 gpstop #正常关闭 gpstop -M fast #快速关闭 gpstop –r #重启 gpstop –u #重新加载配置文件 1.2 登陆 psql gpdb psql -d gpdb -h gphostm -p 5432 -U gpadmin 1.3 查看segment配置 select * from gp_segment_configuration; 1.4 文件系统 select * from pg_filespace_entry; 1.5 列出所有数据库 psql –l

1.6 行表库最大尺寸 一个数据库最大尺寸?无限制(已存在有32TB 的数据库) 一个表的最大尺寸?32 TB 一行记录的最大尺寸?1.6 TB 一个字段的最大尺寸? 1 GB 一个表里最大行数?无限制 一个表里最大列数?250-1600 (与列类型有关) 一个表里的最大索引数量?无限制 当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。事实上,当这些数值变得异常地大时,系统性能也会受很大影响。 表的最大尺寸32 TB 不需要操作系统对大文件的支持。大表用多个 1 GB 的文件存储,因此文件系统尺寸的限制是不重要的。 如果缺省的块大小增长到32K ,最大的表尺寸和最大列数还可以增加到四倍 1.7 存储空间 一个Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。

第2章Psql操作 2.1 创建/删除用户 创建用户: createuser [-a] [-A] [-d] [-D] [-e] [-P] [-h 主机名] [-p port] 用户名参数说明: [-a]:允许创建其他用户,相当于创建一个超级用户; [-A]:不允许此用户创建其他用户; [-d]:允许此用户创建数据库; [-D]:不允许此用户创建数据库; [-e]:将执行过程显示到Shell上; [-P]:创建用户时,同时设置密码; [-h 主机名]:为某个主机上的Postgres创建用户; [-p port]:与-h参数一同使用,指定主机的端口。 createuser -h 172.28.18.51 -p 5000 -D -A -e testuser 创建超级用户:createuser -P -d -a -e testuser 删除用户: 命令:dropuser [-i] [-h] [-p] [-e] 用户名 参数说明: [ -i]:删除用户前,要求确认; [-h 主机名]:删除某个主机上的Postgres用户; [-p port]:与-h参数一同使用,指定主机的端口; [-e]:将执行过程显示到Shell上。 2.2 创建数据库 createdb -p 5432 -e -U gpadmin mydb

【VIP专享】postgresql数据库 pg

postgresql数据库 pg_hba.conf配置说明 当一个客户端应用与数据库服务器进行联接时,它声明它将以哪个 PostgreSQL 用户的名称进行联接,就象我们登录一台 Unix 计算机一样。在 SQL 环境里,活跃的数据库用户名决定数据库对象的各种访问权限 — 参阅Chapter 17获 取更多信息。因此,实际上我们要限制的是用户可以联接的数据库。 认证是数据库服务器建立客户端的标识,然后通过一些手段判断是否允 许此客户端应用(或者运行这个客户端应用的用户)与它所要求的用户名进行 联接的过程。 PostgreSQL 提供多种不同的客户端认证方式。认证某个特定客户端联接所使用的方法可以通过基于(客户端)的主机地址,数据库和用户的方式进行选择;一些认证方法还允许你通过用户名进行限制。 PostgreSQL 用户名在逻辑上是和服务器运行的操作系统用户名相互独立的。如果某个服务器的所有用户在那台服务器机器上也有帐号,那么给数据库用 户赋与操作系统用户名是有意义的。不过,一个接收远程访问的服务器很有可能有许多没有本地操作系统帐号的用户,因而在这种情况下数据库用户和操作系统用户名之间不必有任何联系。 pg_hba.conf 文件 客户端认证是由一个配置文件控制的,通常其文件名是 pg_hba.conf,存放在数据库集群的数据目录里。(HBA 的意思是 host-based authentication:基于主机的认证。)在initdb初始化数据目录的时候,它 会安装一个缺省的文件。不过我们也可以把认证配置文件放在其它地方;参阅hba_file 配置参数。 文件 pg_hba.conf 的常用格式是一套记录,每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。一条记录是由若干用空格和/或 tab 分隔 的字段组成。如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。 每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型 相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法。第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。这个处理过程没有"跨越"或者"回头"的说法:如果选择了一条记录而且认证失败,那么将不考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。 每条记录可以下面七种格式之一 local database user authentication-method [authentication-option] host database user CIDR-address authentication-method

Postgresql数据库 变量类型

一、数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 1. 整数类型: 类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。常用的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用smallint。而只有在integer的范围不够的时候才使用bigint,因为前者(integer)绝对快得多。 2. 任意精度数值: 类型numeric可以存储最多1000位精度的数字并且准确地进行计算。因此非常适合用于货币金额和其它要求计算准确的数量。不过,numeric类型上的算术运算比整数类型或者浮点数类型要慢很多。 numeric字段的最大精度和最大比例都是可以配置的。要声明一个类型为numeric的字段,你可以用下面的语法: NUMERIC(precision,scale) 比如数字23.5141的精度为6,而刻度为4。 在目前的PostgreSQL版本中,decimal和numeric是等效的。 3. 浮点数类型: 数据类型real和double是不准确的、牺牲精度的数字类型。不准确意味着一些数值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储后再把数据打印出来可能显示一些缺失。 4. Serial(序号)类型: serial和bigserial类型不是真正的类型,只是为在表中设置唯一标识做的概念上的便利。 CREATE TABLE tablename ( colname SERIAL

); 等价于 CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename( colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL ); 这样,我们就创建了一个整数字段并且把它的缺省数值安排为从一个序列发生器取值。应用了一个NOT NULL约束以确保空值不会被插入。在大多数情况下你可能还希望附加一个UNIQUE或者PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动发生的。因此,如果你希望一个序列字段有一个唯一约束或者一个主键,那么你现在必须声明,就像其它数据类型一样。 还需要另外说明的是,一个serial类型创建的序列在其所属字段被删除时,该序列也将被自动删除,但是其它情况下是不会被删除的。因此,如果你想用同一个序列发生器同时给几个字段提供数据,那么就应该以独立对象的方式创建该序列发生器。 二、字符类型: 下面是PostgreSQL所支持的字符类型的列表和简单说明: SQL 定义了两种基本的字符类型,varchar(n)和char(n),这里的n是一个正整数。两种类型都可以存储最多n个字符长的字串,试图存储更长的字串到这些类型的字段里会产生一个错误,除非超出长度的字符都是空白,这种情况下该字串将被截断为最大长度。如果没有长度声明,char等于char(1),而varchar则可以接受任何长度的字串。 MyTest=> CREATE TABLE testtable(first_col varchar(2)); CREATE TABLE MyTest=> INSERT INTO testtable VALUES('333'); --插入字符串的长度,超过其字段定义的长度,因此报错。 ERROR: value too long for type character varying(2) --插入字符串中,超出字段定义长度的部分是空格,因此可以插入,但是空白符被截断。 MyTest=> INSERT INTO testtable VALUES('33 '); INSERT 0 1 MyTest=> SELECT * FROM testtable; first_col ----------- 33

postgreSql基础命令及linux下postgreSql命令

(1)用户实用程序: createdb 创建一个新的PostgreSQL的数据库(和SQL语句:CREATE DATABASE 相同)createuser 创建一个新的PostgreSQL的用户(和SQL语句:CREATE USER 相同) dropdb 删除数据库 dropuser 删除用户 pg_dump 将PostgreSQL数据库导出到一个脚本文件 pg_dumpall 将所有的PostgreSQL数据库导出到一个脚本文件 pg_restore 从一个由pg_dump或pg_dumpall程序导出的脚本文件中恢复PostgreSQL数据库 psql 一个基于命令行的PostgreSQL交互式客户端程序 vacuumdb 清理和分析一个PostgreSQL数据库,它是客户端程序psql环境下SQL语句VACUUM的shell 脚本封装,二者功能完全相同 (2)系统实用程序 initdb 创建一个用于存储数据库的PostgreSQL数据目录,并创建预定义的模板数据库template0和template1,生成共享目录表catalog;此程序通常只在安装PostgreSQL时运行一次 initlocation 创建一个辅助的PostgreSQL数据库存储区域 ipcclean 从停止的PostgreSQL服务器中清除共享内在和孤立信号标志 pg_ctl 启动、停止、重启PostgreSQL服务(比如:pg_ctl start 启动PostgreSQL服务,它和service postgresql start相同) pg_controldata 显示PostgreSQL服务的内部控制信息 postgres PostgreSQL单用户模式的数据库服务 postmaster PostgreSQL多用户模式的数据库服务 4.这里面最重要的是psql这个客户端程序最为重要。启用客户端程序psql的方法是: 切换到PostgreSQL预定义的数据库超级用户postgres,启用客户端程序psql,并连接到自己想要的数据库,比如说:

PostgreSQL数据库用户认证

PostgreSQL数据库用户认证作者:小P 来自:https://www.wendangku.net/doc/fc1622462.html, 摘要:为了保证PostgreSQL数据库的安全性,我们需要对访问数据库的用户进行身份验证,本文介绍了有关于PostgreSQL数据库的用户认证的基本知识; 目录 1. pg_hba.conf 文件; 1.1 各个字段的含义; 1.2 authentication-method(认证方法); 1.3 示例 ; 2. 认证方法; 2.1. 信任认证; 2.2. 口令认证; 2.3. Kerberos 认证; 2.4. 基于 Ident 的认证; 2.4.1. 透过 TCP/IP 的身份认证; 2.4.2. 透过本地套接字的身份认证; 2.4. 3. Ident 映射; 2.5 一个 pg_ident.conf 文件例子; 2.6 PAM 认证; 3. 认证问题; 4. 关于本文; 5. 更新日志; 6. 参考文档; 7. 相关文档; +++++++++++++++++++++++++++++++++++++++++++ 正文 +++++++++++++++++++++++++++++++++++++++++++ 当一个客户端应用与数据库服务器进行联接时,它声明它将以哪个PostgreSQL 用户的名称进行联接,就象我们登录一台Unix 计算机一样.在SQL 环境里,活跃的数据库用户名决定数据库对象的各种访问。

因此,实际上我们要限制的是用户可以联接的数据库; 认证是数据库服务器建立客户端应用的标识,然后通过一些手段判断是否允许此客户端应用(或者运行这个客户端应用的用户)与它所要求的用户名进行联接的过程; PostgreSQL 提供多种不同的客户端认证方式.认证某个特定客户端联接所使用的方法可以通过基于(客户端)的主机地址,数据库和用户的方式进行选择;一些认证方法还允许你通过用户名进行限制; PostgreSQL 用户名在逻辑上是和服务器运行的操作系统用户名相互独立的.如果某个服务器的所有用户在那台服务器机器上也有帐号,那么给数据库用户赋与操作系统用户名是有意义的.不过,一个接收远程访问的服务器很有可能有许多没有本地帐号的用户,因而在这种情况下数据库用户和操作系统用户名之间不必有任何联系; 1. pg_hba.conf 文件; 客户端认证是由数据目录里的文件pg_hba.conf 控制的,比如: /etc/postgresql/8.2/main/pg_hba.conf (hba 的意思是host-based authentication:基于主机的认证.)在initdb初始化数据目录的时候,它会安装一个缺省的文件; 文件pg_hba.conf 的常用格式是一套记录,每行一条。空白行行被忽略,井号( "#" )开头的注释也被忽略。一条记录是由若干用空格和/或tab 分隔的字段组成。如果字段用引号包围,那么它可以包含空白.记录不能夸行存在; 每条记录声明一种联接类型,一个客户端IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法.匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的第一条记录将用于执行认证.这个处理过程没有"跨越"或者"回头"的说法∶如果选择了一条记录而且认证失败,那么将不考虑后面的记录.如果没有匹配的记录,那么访问将被拒绝.每条记录可以下面三种格式之一: local database user authentication-method [authentication-option] host database user IP-address IP-mask authentication-method [authentication-option] hostssl database user IP-address IP-mask authentication-method [authentication-option] 1.1 各个字段的含义; local 这条记录匹配通过Unix 域套接字进行的联接企图.没有这种类型的记录,就不允许Unix 域套接字的联接。 host 这条记录匹配通过TCP/IP 网络进行的联接尝试.请注意,除非服务器是带着-i 选项或者打开了postgresql.conf 里面的tcpip_socket 配置参数集启动的,否则TCP/IP 联接是被禁止掉的. hostssl 这条记录匹配通过在TCP/IP 上进行的SSL 联接企图.host 记录可以匹配SSL 和非SSL 的联接企图,但hostssl 记录需要SSL 联接。 要使用这个选项,制作服务器的时候必须打开SSL 支持.而且在服务器启动的时候,必须打开在postgresql.conf里的ssl选项。 database 声明记录所匹配的数据库。值all 表明该记录匹配所有数据库,值sameuser表示如果被请求的数据库和请求的用户同名,则匹配。samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。在其他情况里,这就是一个特定的PostgreSQL 的名字。我们可以通过用逗号分隔的方法声明多个数据库。一个包含数据库名的文件可以通过对该文件前缀@ 来声明.该文件必需和pg_hba.conf 在同一个目录;user

相关文档
相关文档 最新文档