From 9eadbb6bd624c044869d241034bb131c757d4667 Mon Sep 17 00:00:00 2001 From: caicurry Date: Tue, 28 Jun 2022 10:11:39 +0800 Subject: [PATCH] add blogs --- ...40\346\200\273\347\273\223\344\270\200.md" | 533 +++++++++++++++ ...40\346\200\273\347\273\223\344\270\211.md" | 166 +++++ ...40\346\200\273\347\273\223\344\272\214.md" | 606 ++++++++++++++++++ ...40\346\200\273\347\273\223\345\233\233.md" | 527 +++++++++++++++ 4 files changed, 1832 insertions(+) create mode 100644 "content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\200.md" create mode 100644 "content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\211.md" create mode 100644 "content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\272\214.md" create mode 100644 "content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\345\233\233.md" diff --git "a/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\200.md" "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\200.md" new file mode 100644 index 00000000..3d92df16 --- /dev/null +++ "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\200.md" @@ -0,0 +1,533 @@ +参考资料: + +《Postgresql修炼之道从小工到专家》第2、3、6、10章节 + +《PostgreSQL初识与提高(第二版)》中第一、三、四课 【百度网盘学习】 + +Vastbase安装指南:https://172.16.105.2/repos/customer/trunk/customer/Vastbase +G100 V2.2/客户文档 + +## 学习内容: + +1、PG安装与配置 + +2、psql工具的使用 + +3、用户权限管理 + +## 学习目标: + +1、熟悉PostgreSQL安装、Vastbase安装 + +2、熟悉psql常用元命令 + +3、熟悉用户和权限管理 + +## 学习内容总结: + +### 1、PostgreSQL安装 + +安装方式两种: + +1. 从二进制安装包进行安装 + +2. 从源码安装 + +PostgreSQL是一种关系型数据库,使用BSD开源协议 + +体系结构: + +![](media/image1.png){width="6.3in" height="3.022030839895013in"} + +postmaster:守护进程,实际上是第一个pg进程,主要职责: + +![](media/image2.png){width="6.3in" height="2.94in"} + +数据库实例: + +实例是管理和访问数据库的一套方法,即所有客户端的请求,最终都回转换成实例对数据库磁盘文件的各种操作,从而达到读写数据的目的; + +实例和数据库是一一对应的; + +实例中包含了若干个内存结构和进程 + +共享内存 + +Shared Buffer: + +用于缓存表和索引的数据库: + +数据的读写都是直接对Buffer操作的,如果所需的块不在缓存中,则需要从磁盘中获取; + +在buffer中被修改过的,但又没有写到文件中的块被称为脏块; + +由shared_buffers 参数控制尺寸 + +WAL(Write Ahead Log) Buffer: + +预写日志缓存,用于缓存增删改灯写操作产生的事务日志; + +由wal_buffers 参数控制尺寸 + +Clog Buffer: + +Commit Log Buffer是记录事物状态的日志缓存 + +辅助进程 + +PGSQL的目录: + +![](media/image3.png){width="3.6354166666666665in" +height="4.927083333333333in"} + +global:数据库启动之后才有,用于存放全局系统表 + +base:表对象、索引对象 + +![](media/image4.png){width="6.3in" height="2.6775in"} + +层级结构: + +![](media/image5.png){width="4.625in" height="3.4583333333333335in"} + +### 2、Vastbase的安装与使用: + +这里选用的是字符安装 + +1. 登陆到目标服务器 + +> 这里选用的是172.16.103.84 登陆密码:roooot + +2. 添加自己的用户 + +执行useradd vastbasexxx_xxxx + +(5946)是开发提交代码的svn号![](media/image6.png){width="6.3in" +height="0.7748654855643045in"} + +设置完初始密码后,会让重新改下密码: + +这里设置的是:test + +![](media/image7.png){width="6.3in" height="0.8507294400699913in"} + +这里的密码填写在代码里: + +![](media/image8.png){width="6.3in" height="3.533823272090989in"} + +3. 安装测试版本的数据库 + +> ![](media/image9.png){width="6.3in" height="1.7472648731408573in"} + +怎么从ftp上复制路径: + +注意是installer,后缀是tar.gz + +![](media/image10.png){width="6.3in" height="2.6649114173228345in"} + +安装的时候失败了,错误信息如下: + +![](media/image11.png){width="6.3in" height="2.3268285214348206in"} + +原因是没有进入自己创建的用户里安装,使用su - +vasebasexxx_xxxx命令进入第一步创建的用户目录下安装: + +![](media/image12.png){width="6.3in" height="2.2431813210848643in"} + +安装过程中,出现以下提示: + +![](media/image13.png){width="6.3in" height="1.7940780839895014in"} + +数据库初始密码,这里一般填写的是:Aa123456 + +这里的信息中,填入"Y": + +![](media/image14.png){width="4.364583333333333in" height="1.4375in"} + +数据库安装信息: + +![](media/image15.png){width="6.3in" height="2.6395253718285216in"} + +![](media/image16.png){width="6.3in" height="2.8431813210848644in"} + +4、安装完成之后,需要修改配置文件: + +首先,修改配置文件,进入配置文件后可以按大写G快捷键到文末,添加端口号和license路径,端口号自己随便写一个(如果启动数据库时报错端口被占用再修改): + +![](media/image17.png){width="6.3in" height="1.0688167104111985in"} + +配置文件中,需要修改的是: + +![](media/image18.png){width="6.3in" height="1.3909087926509187in"} + +然后一般需要修改shared_buffers,改成50就好: + +![](media/image19.png){width="6.3in" height="1.102108486439195in"} + +![](media/image20.png){width="4.114583333333333in" height="1.25in"} + +4. 修改完配置文件,启动数据库: + +> 使用下面这两个命令: +> +> ![](media/image21.png){width="6.3in" height="0.47155621172353457in"} +> +> 启动失败,原因是:缺少liscense文件 +> +> ![](media/image22.png){width="6.3in" height="2.4904680664916885in"} +> +> 添加license文件: +> +> 先去别的机器上下载: +> +> ![](media/image23.png){width="4.635416666666667in" +> height="6.072916666666667in"} +> +> 然后上传到自己的用户目录下: +> +> ![](media/image24.png){width="6.3in" height="4.236206255468066in"} +> +> 有了license文件后,重新启动数据库: +> +> 启动数据库命令: +> +> source \~/.bashrc +> +> vb_ctl start +> +> ![](media/image25.png){width="6.3in" +> height="1.2796872265966754in"}启动成功。 + +5. 安装成功后,执行以下四句命令: + +> ![](media/image26.png){width="6.3in" height="2.751327646544182in"} +> +> 6001是自己在文件中设置的端口号。 +> +> 后面三句是修改管理员密码的,管理员现在初始是随机密码,上面改的是,新需求前三个管理员的默认密码 + +6. 搭建好数据库后,怎么登陆进去并使用 + +> 使用命令:vsql -p端口号(自己设置的端口号)-dvastbase -r +> +> ![](media/image27.png){width="6.3in" height="2.1060509623797024in"} +> +> 可以执行SQL语句: +> +> ![](media/image28.png){width="5.25in" height="1.0104166666666667in"} +> +> 注意:SQL语句写完之后,必须要写上";" +> +> 如果要退出数据库,用命令:\\q 退出数据库: +> +> ![](media/image29.png){width="4.375in" height="0.46875in"} + +### 3、SQL语法 + +SQL语句分类: + + ------------------------------------------------------------------------------------------------------ + SQL命令 含义 关键字 + ----------------------- ----------------------- ------------------------------------------------------ + DQL 数据查询语句 SELECT + + DML 数据操纵语言 INSERT、UPDATE、DELETE + + DDL 数据定义语言 修改表、索引等数据库对象语言,主要用于数据库对象语言 + ------------------------------------------------------------------------------------------------------ + +注意: + +多条SQL命令之间由分号(";")分割。 + +DDL语句:创建、修改和删除表的语句 + +建表语句: + +CREATE TABLE table_name{ + +co101_name data_type, + +c0102_name data_type, + +}; + +co101_name、co102_name分表表示列名;后面是对应的数据类型,比如varchar、int、date等等。 + +删除表语句: + +DROP TABLE table_name; + +DML语句:插入、更新和删除语句。主要是INSERT、UPDATE、DELETE + +插入语句: + +INSERT INTO table_name + +VALUES (value1,value2,value3,\...); + +更新语句: + +UPDATE table_name + +SET column1=value1,column2=value2,\... + +WHERE some_column=some_value; + +删除数据语句: + +DELETE FROM table_name + +WHERE some_column=some_value; + +DQL语句: + +单表查询语句: + +SELECT \* FROM table_name; + +或者 + +SELECT column_name,column_name + +FROM table_name; + +注意: + +当表达式与表的列无关时,可不使用"FROM表名",这样的话,就可以当作计算器使用了,比如: + +![](media/image30.png){width="2.59375in" height="0.7916666666666666in"} + +过滤条件的查询: + +SELECT column_name,column_name + +FROM table_name + +WHERE column_name operator value; + +排序语句: + +SELECT column_name,column_name + +FROM table_name + +ORDER BY column_name,column_name ASC\|DESC; + +ORDER +BY默认按照升序对数据进行排序,如果需要按照降序排序的话,可以使用DESC关键字。 + +分组查询: + +SELECT column_name, aggregate_function(column_name) + +FROM table_name + +WHERE column_name operator value + +GROUP BY column_name; + +aggregate_function\-\--\>聚合函数 + +例如,统计不同年龄的学生人数: + +SELECT age count(\*) FROM student GROUP BY age; + +表join: + +多表关联查询。 + +![](media/image31.png){width="3.8020833333333335in" +height="2.9895833333333335in"} + +insert into \...\... select语句: + +此语句可以将数据从一张表插入到另一张表中,属于DML语句 + +例如: + +INSERT INTO table_name1 + +SELECT \* + +FROM table_name2; + +union语句: + +UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 + +SELECT column_name(s) FROM table1 + +UNION + +SELECT column_name(s) FROM table2; + +如果不想合并,可以使用UNION ALL, + +SELECT column_name(s) FROM table1 + +UNION ALL + +SELECT column_name(s) FROM table2; + +truncate table语句: + +TRUNCATE TABLE table_name; + +TRUNCATE TABLE [**错误!超链接引用无效。**](\h)在功能上与不带 WHERE +子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 +DELETE 速度快,且使用的系统和事务日志资源少。 + +三种删除语句的区别: + ++-------------+-------------+-------------+-------------+-------------+ +| | 语法结构 | 意义 | 不同点 | 数据 | +| | | | | 库操作语言 | ++=============+=============+=============+=============+=============+ +| drop | drop table | 删除内容 | 执行dro | DDL | +| | 表名 | 和定义,并 | p语句,将使 | | +| | | 释放空间。 | 此表的结构 | | +| | | | 一起删除。 | | ++-------------+-------------+-------------+-------------+-------------+ +| truncate | truncate | 删除内容 | 与drop | DDL | +| | table 表名 | 、释放空间 | 不同,trunc | | +| | | | ate不删除定 | | +| | | | 义(也就是保 | | +| | | | 留表的数据 | | +| | | | 结构),与de | | +| | | | lete相比,t | | +| | | | runcate不能 | | +| | | | 删除行数据 | | ++-------------+-------------+-------------+-------------+-------------+ +| delete | delete from | 与truncat | 但是del | DML | +| | 表名 | e类似,只删 | ete既可以对 | | +| | | 除内容、释 | 行数据进行 | | +| | (where | 放空间但不 | 删除,也可 | | +| | 列名 = 值) | 删除定义; | 以对整表数 | | +| | | | 据进行删除 | | ++-------------+-------------+-------------+-------------+-------------+ + +注意: + +1.delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。 + +2.执行速度一般来说:drop\>truncate\>delete + +3.delete语句是数据库操作语言(dml),这个操作会放到 rollback segement +中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。 + +4.truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 +rollback segment 中,不能回滚,操作不触发trigger。 + +5.truncate语句执行以后,id标识列还是按顺序排列,保持连续;而delete语句执行后,ID标识列不连续 + +### 4、psql工具的使用介绍(持续更新) + +psql:PGSQL自带的命令行客户端工具 + +https://zhuanlan.zhihu.com/p/386032397 + +pgadmin:图形化工具 + +操作系统层面的一些命令: + +输入SQL语句:psql + +调用单条SQL:psql -c \'sql 语句\' + +调用SQL脚本:cat xxx.script + +psql -f xxx.script + +psql 进入数据库环境中,然后输入help + +psql命令: + +常见psql(vastbase sql)数据库操作命令: + ++-----------------------+-----------------------+-----------------------+ +| 命令 | 作用 | | ++=======================+=======================+=======================+ +| \\d | 查看数据库中有哪些表 | ![](media/image32.p | +| | | ng){width="2.09375in" | +| | | height="0 | +| | | .9455643044619423in"} | ++-----------------------+-----------------------+-----------------------+ +| \\d table_name | 查看指定表的定义情况 | ![](media/image33.p | +| | | ng){width="2.09375in" | +| | | height="0 | +| | | .6659011373578303in"} | ++-----------------------+-----------------------+-----------------------+ +| \\q | 退出数据库 | | ++-----------------------+-----------------------+-----------------------+ +| \\d+ table_name | 显示比\\d更详细的信息 | ![](media/image34.p | +| | | ng){width="2.09375in" | +| | | height="0 | +| | | .4638451443569554in"} | ++-----------------------+-----------------------+-----------------------+ +| \\timing | 显 | | +| | 示SQL执行已执行的时间 | | ++-----------------------+-----------------------+-----------------------+ +| \\db | 显示所有的表空间 | ![](media/image35.p | +| | | ng){width="2.09375in" | +| | | height="0 | +| | | .6483180227471566in"} | ++-----------------------+-----------------------+-----------------------+ +| > vsql | 进入数据 | | +| > -p端口号(自己设置 | 库,输入SQL语句并执行 | | +| 的端口号)-dvastbase | | | +| > -r | | | ++-----------------------+-----------------------+-----------------------+ + +### ![](media/image36.png){width="3.125in" height="2.6041666666666665in"} + +\\timing on 可以显示执行此条SQL语句花费了多长时间 + +\\timing off 表示关闭显示花费时间 + +![](media/image37.png){width="3.3541666666666665in" +height="2.4791666666666665in"} + +### 5、用户及管理权限 + +PostgreSQL 使用角色的概念管理数据库访问权限。 + +创建用户与角色: + +create role name \[ \[with\] option \[\...\] \] + +上面语句中的option可以为以下内容: + +![](media/image38.png){width="6.3in" height="3.927655293088364in"} + +![](media/image39.png){width="6.3in" height="1.698046806649169in"} + +权限的管理 + +用户权限分为两类: + +一类是创建用户时就指定的权限: + +![](media/image40.png){width="2.6875in" height="0.9583333333333334in"} + +另一类是由命令GRANT 和 REVOKE 来管理的: + +![](media/image41.png){width="6.3in" height="2.5790616797900263in"} + +各种权限说明: + +![](media/image42.png){width="6.3in" height="6.416021434820648in"} + +总结: + +PGSQL中的权限是按照以下几个层次进行管理的: + +1)首先管理赋在用户特殊属性上的权限,如超级用户的权限、创建数据库的权限、创建用户的权限、Login的权限等。 + +2)然后是在数据库中创建模式的权限。 + +3)接着是在模式中创建数据库对象的权限,如创建表表、创建索引,等等。 + +4)之后是查询表、往表中插人数据、更新表、删除表中数据的权限。 + +5)最后是操作表中某些字段的权限。 diff --git "a/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\211.md" "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\211.md" new file mode 100644 index 00000000..04b3cb12 --- /dev/null +++ "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\270\211.md" @@ -0,0 +1,166 @@ +学习内容: + +事务管理、plpgsql + +学习目标: + +1、熟悉事务管理 + +2、了解plpgsql使用 + +学习总结: + +事务管理: + +数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的: + +- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 + +- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 + +当事务被提交给了数据库管理系统(DBMS),则 DBMS +需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。 + +事务的属性 + +事务具有以下四个标准属性,通常根据首字母缩写为 ACID: + +- 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 + +- 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。 + +- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 + +- 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。 + +事务控制 + +使用下面的命令来控制事务: + +- **BEGIN TRANSACTION**:开始一个事务。 + +- **COMMIT**:事务确认,或者可以使用 END TRANSACTION 命令。 + +- **ROLLBACK**:事务回滚。 + +事务控制命令只与 INSERT、UPDATE 和 DELETE +一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。 + +BEGIN TRANSACTION 命令 + +事务可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN +命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 +ROLLBACK +命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法: + +BEGIN; + +或者 + +BEGIN TRANSACTION; + +COMMIT 命令 + +COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令,即确认事务。 + +COMMIT 命令的语法如下: + +COMMIT; + +或者 + +END TRANSACTION; + +ROLLBACK 命令 + +ROLLBACK 命令是用于撤消尚未保存到数据库的事务命令,即回滚事务。 + +ROLLBACK 命令的语法如下: + +ROLLBACK; + +在psql +的默认配置下,自动提交'AUTOCOMMIT'项是自动打开的,也就是说,每执行一条SQL,都会自动提交。可以设置psql中的内置变量AUTOCOMMIT来关闭自动提交: + +![](media/document_image_rId11.png){width="3.3229166666666665in" +height="0.53125in"} + +PostgreSQL支持保存点(SAVEPOINT)的功能,在一个大的事务中,可以把操作过程分成几个部分,第一个部分成功后,可以建一个保存点,若后面的执行失败,则回滚到这个保存点,而不必把整个事务都回滚掉。 + +事务隔离级别: + +数据库的事务隔离级别有以下四种: + +(1)读未提交(READ UNCOMMITTED) + +(2)读已提交(READ COMMITTED) + +(3)重复读(REPEATABLE READ) + +(4)串行化(SERIALIZABLE) + +对于并发事务,我们不希望发生的行为如下: + +(1)脏读:一个事务读取了另一个未提交的事务写入的数据。 + +(2)不可重复读:一个事务重新读取前面读取过的数据时,发现该数据已改变。 + +(3)幻读:一个事务开始后,需要根据数据库中现有的数据做一些更新,于是重新执行一个查询,返回符合查询条件的行,这时发现这些行因为其它最近提交的事务而发生了改变,导致现有事务如果再进行下去可能发发生逻辑上的错误。 + +1) \"不可重复读\" 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题 + +要避免这种情况,通常可以用 set tran isolation level repeatable read 来设置隔离级别,这样事务A 在两次读取表T中的数据时,事务B如果企图更改表T中的数据(细节到事务A读取数据)时,就会被阻塞,知道事务A提交! 这样就保证了,事务A两次读取的数据的一致性。 + +2)幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题 + +不同事务隔离级别下的行为见下表: + +![](media/document_image_rId12.png){width="6.291666666666667in" +height="1.34375in"}锁机制 + +在PostgreSQL数据库中有两类锁:表级锁和行级锁。当要查询、插人、更新、删除表中的数据时,首先是要获得表上的锁,然后再获得行上的锁。 + +锁主要是为了保持数据库数据的一致性,可以阻止用户修改一行或整个表,一般用在并发较高的数据库中。 + +在多个用户访问数据库的时候若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 + +数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share +Locks)。如果数据对象加上排它锁,则其他的事务不能对它读取和修改。 + +如果加上共享锁,则该数据库对象可以被其他事务读取,但不能修改。 + +LOCK 命令语法 + +LOCK 命令基础语法如下: + +> LOCK \[ TABLE \] +> +> name +> +> IN +> +> lock_mode +> +> name:要锁定的现有表的名称(可选模式限定)。如果只在表名之前指定,则只锁定该表。如果未指定,则锁定该表及其所有子表(如果有)。 +> +> lock_mode:锁定模式指定该锁与哪个锁冲突。如果没有指定锁定模式,则使用限制最大的访问独占模式。可能的值是:ACCESS +> SHARE,ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, +> SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE。 + +一旦获得了锁,锁将在当前事务的其余时间保持。没有解锁表命令;锁总是在事务结束时释放。 + +死锁及防范 + +当两个事务彼此等待对方完成其操作时,可能会发生死锁。尽管 PostgreSQL +可以检测它们并以回滚结束它们,但死锁仍然很不方便。为了防止应用程序遇到这个问题,请确保将应用程序设计为以相同的顺序锁定对象。 + +锁的查看 + +我们常常需要查看一个事务产生了哪些锁,哪个事务被哪个事务阻塞了。若执行一条 +SQL时阻塞住了,则需要查询为何阻塞住了,是谁把我给阻塞住了。这些信息可通过查询系统视图pglocks来查找。pglocks视图中各列的描述见表。 + +![](media/document_image_rId13.png){width="6.3in" +height="4.9205872703412075in"} + +![](media/document_image_rId14.png){width="6.114583333333333in" +height="1.4375in"} diff --git "a/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\272\214.md" "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\272\214.md" new file mode 100644 index 00000000..48c25e31 --- /dev/null +++ "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\344\272\214.md" @@ -0,0 +1,606 @@ +### 学习资料: + +《Postgresql修炼之道从小工到专家》第5、6章节 + +《PostgreSQL初识与提高(第二版)》中第三、五课 + +### 学习内容: + +数据类型、对象管理 + +### 学习目标: + +1、熟悉常用数据类型 + +2、熟悉各类对象的创建、删除、修改 + +### 学习内容总结: + +#### 数据类型 + +PG SQL支持的数据类型 + +布尔类型、数值类型、字符类型、二进制数据类型、位串类型、日期和时间类型、枚举类型、几何类型、网络地址类型、数组类型、复合类型、xml、json、range、对象标识符类型、伪类型、其他类型。 + +布尔类型:boolean的状态有两种:要么是true,要么是false,第三种\"unknown\"(未知)状态,用 +NULL 表示。 + + ------------------------------------------------------------------------ + **名称** **存储格式** **描述** + ---------------------- ----------------------- ------------------------- + boolean 1 字节 true/false + + ------------------------------------------------------------------------ + +在SQL中可用不带引号的TRUE或者FALSE表示,也可以用更多的表示真和假的带引号的字符表示,如'true'、'false'、'yes\'、'no'等 + +CREATE TABLE t1(id int,col1 boolean,col2 text); + +insert into t1(1,TRUE,\'TRUE\'); + +布尔类型的操作符: + +常用的逻辑操作符有:AND、OR、NOT + +AND、OR运算真值表: + +![](media/document_image_rId11.png){width="6.229166666666667in" +height="1.7395833333333333in"} + +NOT运算真值表: + +![](media/document_image_rId12.png){width="6.114583333333333in" +height="1.0104166666666667in"} + +数值类型:由 2 字节、4 字节或 8 字节的整数以及 4 字节或 8 +字节的浮点数和可选精度的十进制数组成。 + + ---------------------------------------------------------------------------------------- + **名字** **存储长度** **描述** **范围** + ------------- -------------- ---------------------- ------------------------------------ + smallint 2 字节 小范围整数 -32768 到 +32767 + + integer 4 字节 常用的整数 -2147483648 到 +2147483647 + + bigint 8 字节 大范围整数 -9223372036854775808 到 + +9223372036854775807 + + decimal 可变长 用户指定的精度,精确 小数点前 131072 位;小数点后 16383 + 位 + + numeric 可变长 用户指定的精度,精确 小数点前 131072 位;小数点后 16383 + 位 + + real 4 字节 可变精度,不精确 6 位十进制数字精度 + + double 8 字节 可变精度,不精确 15 位十进制数字精度 + precision + + smallserial 2 字节 自增的小范围整数 1 到 32767 + + serial 4 字节 自增整数 1 到 2147483647 + + bigserial 8 字节 自增的大范围整数 1 到 9223372036854775807 + ---------------------------------------------------------------------------------------- + +货币类型: + +money 类型存储带有固定小数精度的货币金额。 + +numeric、int 和 bigint 类型的值可以转换为 +money,不建议使用浮点数来处理处理货币类型,因为存在舍入错误的可能性。 + + ----------------------------------------------------------------------------------- + **名字** **存储容量** **描述** **范围** + ---------- -------------- ---------- ---------------------------------------------- + money 8 字节 货币金额 -92233720368547758.08 到 +92233720368547758.07 + + ----------------------------------------------------------------------------------- + +字符串类型: + +下表列出了 PostgreSQL 所支持的字符类型: + ++------+---------------------------------------------------------------+ +| **序 | **名字 & 描述** | +| 号** | | ++======+===============================================================+ +| 1 | **character varying(n), varchar(n)** | +| | | +| | 变长,有长度限制,最大1GB | ++------+---------------------------------------------------------------+ +| 2 | **character(n), char(n)** | +| | | +| | 定长,不足补空白,最大1GB | ++------+---------------------------------------------------------------+ +| 3 | **text** | +| | | +| | 变长,无长度限制 | ++------+---------------------------------------------------------------+ + +varchar和char分别是**character +varying和character**的别名。没有声明长度的character等于character(1)。如果使用varchar时没有带长度说明词,那么该类型接受任何长度的字符串。在大多数情况下,应该使用text或者varchar。 + +二进制数据类型:PGSQL只有一种二进制类型bytea。 + +位串类型: + +位串就是一串0和1的字符串。下面是两种SQL位类型: + +bit(n) + +bit varying(n) + +这里的n是一个正整数。bit 类型的数据必须准确匹配长度 n, +试图存储短些或者长一些的数据都是错误的。bit varying 类型数据是最长 n +的变长类型;更长的串会被拒绝。 写一个没有长度的bit 等效于 bit(1), +没有长度的 bit varying 意思是没有长度限制。 + +日期和时间类型: + + ------------------------------------------------------------------------------------------------------------- + **名字** **存储空间** **描述** **最低值** **最高值** **分辨率** + ---------------------- -------------- -------------------------- --------------- --------------- ------------ + timestamp \[ (*p*) \] 8 字节 日期和时间(无时区) 4713 BC 294276 AD 1 毫秒 / 14 + \[ without time zone 位 + \] + + timestamp \[ (*p*) \] 8 字节 日期和时间,有时区 4713 BC 294276 AD 1 毫秒 / 14 + with time zone 位 + + date 4 字节 只用于日期 4713 BC 5874897 AD 1 天 + + time \[ (*p*) \] \[ 8 字节 只用于一日内时间 00:00:00 24:00:00 1 毫秒 / 14 + without time zone \] 位 + + time \[ (*p*) \] with 12 字节 只用于一日内时间,带时区 00:00:00+1459 24:00:00-1459 1 毫秒 / 14 + time zone 位 + + interval 12 字节 时间间隔 -178000000 年 178000000 年 1 毫秒 / 14 + \[ *fields* \] \[ 位 + (*p*) \] + ------------------------------------------------------------------------------------------------------------- + +枚举类型: + +枚举类型是一个包含一系列有序的静态值集合的数据类型,相当于某些编程语言中的enum类型。PostgtesSQL中的枚举类型类似于 +C 语言中的 enum 类型。与其他类型不同的是枚举类型需要使用 CREATE TYPE +命令创建。 + +CREATE TYPE mood AS ENUM (\'sad\', \'ok\', \'happy\'); + +创建一周中的几天,如下所示: + +CREATE TYPE week AS ENUM (\'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', +\'Sat\', \'Sun\'); + +就像其他类型一样,一旦创建,枚举类型可以用于表和函数定义。 + +CREATE TYPE mood AS ENUM (\'sad\', \'ok\', \'happy\'); CREATE TABLE +person ( name text, current_mood mood ); + +INSERT INTO person VALUES (\'Moe\', \'happy\'); + +SELECT \* FROM person WHERE current_mood = \'happy\'; + +![](media/document_image_rId13.png){width="5.6875in" height="2.03125in"} + +几何类型: + +最基本的类型是"point",它是其他类型的基础, + + ------------------------------------------------------------------------------ + **名字** **存储空间** **说明** **表现形式** + ------------- ------------------- ------------------------ ------------------- + point 16 字节 平面中的点 (x,y) + + line 32 字节 (无穷)直线(未完全实现) ((x1,y1),(x2,y2)) + + lseg 32 字节 (有限)线段 ((x1,y1),(x2,y2)) + + box 32 字节 矩形 ((x1,y1),(x2,y2)) + + path 16+16n 字节 闭合路径(与多边形类似) ((x1,y1),\...) + + path 16+16n 字节 开放路径 \[(x1,y1),\...\] + + polygon 40+16n 字节 多边形(与闭合路径相似) ((x1,y1),\...) + + circle 24 字节 圆 \<(x,y),r\> + (圆心和半径) + ------------------------------------------------------------------------------ + +网络地址类型: + +PostgreSQL 提供用于存储 IPv4 、IPv6 、MAC 地址的数据类型。 + +用这些数据类型存储网络地址比用纯文本类型好, +因为这些类型提供输入错误检查和特殊的操作和功能。 + + ------------------------------------------------------------------------ + **名字** **存储空间** **描述** + --------------- ------------------- ------------------------------------ + cidr 7 或 19 字节 IPv4 或 IPv6 网络 + + inet 7 或 19 字节 IPv4 或 IPv6 主机和网络 + + macaddr 6 字节 MAC 地址 + ------------------------------------------------------------------------ + +在对 inet 或 cidr 数据类型进行排序的时候, IPv4 地址总是排在 IPv6 +地址前面,包括那些封装或者是映射在 IPv6 地址里的 IPv4 地址, 比如 +::10.2.3.4 或 ::ffff:10.4.3.2。 + +数组类型: + +PostgreSQL 允许将字段定义成变长的多维数组。 + +数组类型可以是任何基本类型或用户定义类型,枚举类型或复合类型。 + +声明数组 + +创建表的时候,我们可以声明数组,方式如下: + +CREATE TABLE sal_emp ( + +name text, + +pay_by_quarter integer\[\], + +schedule text\[\]\[\] + +); + +pay_by_quarter 为一维整型数组、schedule 为二维文本类型数组。 + +插入值 + +INSERT INTO sal_emp + +VALUES (\'Bill\', + +\'{10000, 10000, 10000, 10000}\', + +\'{{\"meeting\", \"lunch\"}, {\"training\", \"presentation\"}}\'); + +INSERT INTO sal_emp + +VALUES (\'Carol\', + +\'{20000, 25000, 25000, 25000}\', + +\'{{\"breakfast\", \"consulting\"}, {\"meeting\", \"lunch\"}}\'); + +访问数组 + +首先,我们演示如何访问数组的一个元素。 +这个查询检索在第二季度薪水变化的雇员名: + +SELECT name FROM sal_emp WHERE pay_by_quarter\[1\] \<\> +pay_by_quarter\[2\]; + +name + +\-\-\-\-\-\-- + +Carol + +数组的下标数字是写在方括弧内的。 + +修改数组 + +UPDATE sal_emp SET pay_by_quarter = \'{25000,25000,27000,27000}\' WHERE +name = \'Carol\'; + +数组中检索 + +要搜索一个数组中的数值,你必须检查该数组的每一个值。如: + +SELECT \* FROM sal_emp WHERE pay_by_quarter\[1\] = 10000 OR +pay_by_quarter\[2\] = 10000 OR pay_by_quarter\[3\] = 10000 OR +pay_by_quarter\[4\] = 10000; + +复合类型: + +复合类型表示一行或者一条记录的结构; +它实际上只是一个字段名和它们的数据类型的列表。PostgreSQL +允许像简单数据类型那样使用复合类型。比如,一个表的某个字段可以声明为一个复合类型。 + +声明复合类型: + +CREATE TABLE on_hand ( + +item inventory_item, + +count integer + +); + +语法类似于 CREATE TABLE,只是这里只可以声明字段名字和类型。 + +插入数值: + +INSERT INTO on_hand VALUES (ROW(\'fuzzy dice\', 42, 1.99), 1000); + +复合类型值输入: + +要以文本常量书写复合类型值,在圆括弧里包围字段值并且用逗号分隔他们。 +你可以在任何字段值周围放上双引号,如果值本身包含逗号或者圆括弧, +你必须用双引号括起。 + +访问复合类型: + +SELECT (item).name FROM on_hand WHERE (item).price \> 9.99; + +XML类型: + +xml 数据类型可以用于存储XML数据。 将 XML 数据存到 text +类型中的优势在于它能够为结构良好性来检查输入值, +并且还支持函数对其进行类型安全性检查。 +要使用这个数据类型,编译时必须使用 configure \--with-libxml。 + +xml 可以存储由XML标准定义的格式良好的\"文档\", 以及由 XML 标准中的 +XMLDecl? content 定义的\"内容\"片段, +大致上,这意味着内容片段可以有多个顶级元素或字符节点。 xmlvalue IS +DOCUMENT 表达式可以用来判断一个特定的 xml 值是一个完整的文件还是内容片段 + +创建XML值 + +使用函数 xmlparse: 来从字符数据产生 xml 类型的值: + +XMLPARSE (DOCUMENT \'\\\Manual\\\...\\\') +XMLPARSE (CONTENT \'abc\bar\\foo\\') + +json类型: + +json 数据类型可以用来存储 JSON(JavaScript Object Notation)数据, +这样的数据也可以存储为 text,但是 json +数据类型更有利于检查每个存储的数值是可用的 JSON 值。 + +![](media/document_image_rId14.png){width="6.3in" +height="1.3239840332458443in"} + +range类型: + +range类型,可以进行范围快速搜索。用于表示范围,而范围底下的基本类型成为range类型的subtype。 + +range类型: + +int4range:4字节整数的范围类型 + +int8range:8字节整数的范围类型 + +numrange:numeric的范围类型 + +tsrange:无时区的时间戳范围类型 + +tstzrange:有时区的时间戳范围类型 + +datarange:日期的范围类型 + +还可以使用create type创建一些range类型: + +create type tname as range( + +subtype=subtype \--指定子类型 + +\[,subtype_opclass=subtype_operation_class\] \--指定子类型的操作符 + +\[,collation = collation\] \-\--指定排序规则 + +\'(\' \')\' 表示范围内不包括此元素,\'\[\' \'\]\' +表示范围内包括此元素。如果是稀疏类型的range,其内部存储格式为\"\'\[v1,v2)\'\"。empty表示空,即范围内不包括任何东西。 + +postgres=# select \'(0,6)\'::int4range; + +int4range + +\-\-\-\-\-\-\-\-\-\-- + +\[1,6) + +(1 row) + +postgres=# select \'\[0,6)\'::int4range; + +int4range + +\-\-\-\-\-\-\-\-\-\-- + +\[0,6) + +(1 row) + +postgres=# select \'\[0,6\]\'::int4range; + +int4range + +\-\-\-\-\-\-\-\-\-\-- + +\[0,7) + +(1 row) + +postgres=# select \'empty\'::int4range; + +int4range + +\-\-\-\-\-\-\-\-\-\-- + +empty + +(1 row) + +postgres=# select \'(0,6)\'::numrange; + +numrange + +\-\-\-\-\-\-\-\-\-- + +(0,6) + +(1 row) + +postgres=# select \'\[0,6)\'::numrange; + +numrange + +\-\-\-\-\-\-\-\-\-- + +\[0,6) + +(1 row) + +postgres=# select \'\[0,6\]\'::numrange; + +numrange + +\-\-\-\-\-\-\-\-\-- + +\[0,6\] + +(1 row) + +postgres=# select \'(0,6\]\'::numrange; + +numrange + +\-\-\-\-\-\-\-\-\-- + +(0,6\] + +(1 row) + +postgres=# select \'empty\'::numrange; + +numrange + +\-\-\-\-\-\-\-\-\-- + +empty + +(1 row) + +postgres=# select int4range(1,10,\'\[)\'); + +int4range + +\-\-\-\-\-\-\-\-\-\-- + +\[1,10) + +(1 row) + +#### 逻辑结构管理 + +**数据库逻辑结构:** + +在一个pgsql数据库系统中,数据的结构组织可以分为以下三层: + +数据库 + +表、索引 + +数据行 + +**数据库基本操作:** + +数据库基本操作包括创建数据库、删除数据库、修改数据库等; + +创建数据库: + +![](media/document_image_rId15.png){width="6.3in" +height="1.9581080489938758in"} + +简单点, + +create database test1; + +![](media/document_image_rId16.png){width="11.458333333333334in" +height="7.416666666666667in"} + +在日常使用中,很少会用到指定数据库的字符集。因为pgsql数据库服务端并不支持通常的汉字字符集"GBK"、"GB80303",所以一般都是使用"UTF8"字符集来支持中文的。 + +修改数据库: + +alter database name \[ \[with\] option \[\...\] \]; + +例如: + +改变数据库testdb01的最大连接数为10: + +alter database testdb01 connection limit 10; + +改变数据库testdb01 的名称为mydb01: + +alter database testdb01 rename to mydb01; + +删除数据库: + +drop database XXXX; + +**模式(Schema):** + +模式是数据库中的一个概念,可将其理解为一个命名空间或目录。不同的模式下可以有相同名称的表、函数等对象可以互相调用。 + +使用模式的优势: + +- 允许多个用户使用一个数据库并且不会互相干扰。 + +- 将数据库对象组织成逻辑组以便更容易管理。 + +- 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突 + +语法格式: + +CREATE SCHEMA myschema.mytable ( + +\... + +); + +实例: + +创建模式: + +create schema myschema; + +建表格: + +create table myschema.company( + +ID INT NOT NULL, + +NAME VARCHAR (20) NOT NULL, + +AGE INT NOT NULL, + +ADDRESS CHAR (25), + +SALARY DECIMAL (18, 2), + +PRIMARY KEY (ID) + +); + +查看表结构: + +select \* from myschema.company; + +查看模式: + +**\\dn** + +![](media/document_image_rId17.png){width="5.822916666666667in" +height="3.9583333333333335in"} + +删除模式: + +删除一个空的模式: + +drop schema myschema; + +删除一个模式以及其中包含的所有对象: + +drop schema myschema CASEADE; diff --git "a/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\345\233\233.md" "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\345\233\233.md" new file mode 100644 index 00000000..7b3ea102 --- /dev/null +++ "b/content/zh/post/caidi/Postgres\345\255\246\344\271\240\346\200\273\347\273\223\345\233\233.md" @@ -0,0 +1,527 @@ +参考资料: + +《Postgressql修炼之道从小工到专家》第8.4、9、12章节 + +《PostgreSQL初识与提高(第二版)》中第七、九课 + +学习内容: + +备份恢复、数据库优化 + +学习目标: + +1、熟悉备份恢复用法 + +2、掌握执行计划查看分析,了解数据库优化参数 + +学习总结: + +## 数据库备份 + +数据备份的方式:逻辑备份和物理备份 + +物理备份的方式有: + +![](media/document_image_rId11.png){width="6.3in" +height="2.60367125984252in"} + +二者的区别是: + +pg_dump可以选择一个数据库或者部分表进行备份。 + +pg_dumpall是将一个postgresql数据库集群全部转储到一个脚本文件中。 + +pg_dump可以在数据库数据库正在使用时进行完整一致的备份(不会阻塞其他用户对数据库的访问)。 + +pg_dump生成的备份文件: + +![](media/document_image_rId12.png){width="6.3in" +height="0.9204932195975503in"} + +SQL脚本文件:包含许多SQL命令,这些SQL都是可执行的,执行这些SQL语句可以重建该数据库,并将之恢复成保存成脚本时的状态。使用psql程序来执行这个SQL脚本文件即可恢复数据。 + +归档文件:可以将整个数据库备份到一个归档格式的备份文件中,而pg_restore则可以从这个归档格式的备份文件中选择性地恢复部分表或者数据库对象。归档格式的备份文件分为两种: + +一种是"custom"自定义格式(使用命令项参数- +Fc来指定),它允许对归档元素进行选取和重新排列,并且默认格式是压缩的。 + +另一种是,tar格式(使用命令项参数- +Ft来指定),这种格式的文件不是压缩的,并且加载时不能重排列,但是也很灵活,可使用标准UNIX的tar工具进行处理。 + +运行pg_dump时,应该检查输出,查看是否有警告存在。 + +命令格式: + +![](media/document_image_rId13.png){width="6.3in" +height="0.6345975503062117in"} + +连接选项的参数如下: + +参数 描述 + +![](media/document_image_rId14.png){width="6.3in" height="5.145in"} + +-h host 或 \--host=host:指定运行服务器的主机名。 + +-p port 或 \--port=port:监听端口号,默认端口为5432。 + +-U username 或 \--username=username:指定要连接的用户名。 + +-w 或 \--no-password:从不提示密码,该选项常用于后台脚本中。 + +-W 或 \--password:强制 pg_dump +在连接到一个数据库之前提示密码,某些情况下可避免额外的连接尝试。 + +--role=rolename:该选项会导致 pg_dump 在连接到数据库时发布一个 set role +rolename 命令。相当于切换到另一个角色。当已验证的用户缺少 +pg_dump需要的权限时,可以使用这个功能切换到一个相应权限的角色。 + +dbname:指定连接的数据库名。 + +-a 或 +\--data-only:只对纯文本格式有意义,只输出数据,不输出数据定义的sql。 + +-b 或 \--blobs:在输出中是否包含大对象。除非指定了选择性输出的选项 +\--schema、--table、--schema-only 开关,否则默认会输出大对象。 + +-c 或 +\--clean:只对纯文本格式有意义。指定输出的脚本中是否生成清理该数据库对象语句(如drop +table 命令)。 + +-C 或 \--create:只对纯文本格式有意义。指定脚本中是否输出一条 create +database +语句和连接到该数据库的语句。一般在备份的源数据库和目标数据库的名称一致时,才指定此参数。 + +-E encoding 或 +\--encoding=encoding:以指定的字符集编码创建输出,默认为数据库字符集。 + +-f file 或 \--file=file:输出到指定的文件中。 + +-F format 或 \--format=format:选择输出的格式,可以是p、c、t。 + +p 是 plain 的意思,为纯文本 sql 脚本文件格式,为默认格式。 + +c 是 custom 的意思,以一个适合 pg_restore +使用的自定义格式输出并归档。这是最灵活的输出格式,在该格式中允许手动查询并且可以在 +pg_restore 恢复时重排归档项的顺序。该格式默认是压缩的。 + +t 是 tar 的意思,以一个适合输入 pg_restore 的 tar +格式输出并归档。该格式允许手动选择并且在恢复时重排序归档项的顺序,但这个重排序是有限制的,比如,表数据项的相关顺序在恢复时不能更改。同时,tar +格式不支持压缩,并且对独立表的大小限制为 8GB。 + +-n schema 或 \--schema=schema:只输出匹配 schema +的模式内容,如果没有指定这个选项,目标数据库中所有非系统模式都会被输出。可以使用多个 +-n +指定多个模式,也可以使用通配符匹配多个模式,使用通配符时最好用引号进行界定,防止 +shell 将通配符进行扩展。 + +-N schema 或 \--exclude-schema=schema:排除模式输出。优先级低于 -n。 + +-o 或 \--oids:指定是否为每个表都输出对象标识(OID)。 + +-O 或 +\--no--owner:只对纯文本格式有意义,表示不把对象的所有权设置为对应源端数据库中的owner,为了让脚本可以被任何用户使用。 + +-s 或 +\--schema-only:只输出对象定义(模式),不输出数据。这个选项在备份表结构或在另一个数据库上创建相同结构的表时比较有用。 + +-S username 或 +\--superuser=username:指定关闭触发器时需要用到的超级用户名。它只在使用了 +\--disable-triggers +时才有作用。一般情况下最好不要输入这个参数,而是用超级用户启动生成的脚本。 + +-t table 或 \--table=table:只输出匹配表、视图、序列,可以使用多个 -t +匹配多个表,也可以匹配通配符,使用通配符时最好用引号进行界定,防止shell将通配符进行扩展。优先级高于 +-n。 + +-T table 或 \--exclude-table=table:排除表输出。优先级低于 -t。 + +-v 或 \--verbose:执行过程中打印更详细的信息。使用此选项后,pg_dump +将输出详细的对象评注及输出文件的启停时间和进度信息(输出到标准错误上)。 + +-V 或 \--version:输出 pg_dump 版本并退出。 + +-x 或 \--no--privileges 或 +\--no-acl:禁止输出访问权限(grant/revoke命令)。 + +-Z 0.9 或 +\--compress=0.9:指定要使用的压缩级别,0表示不压缩。对于自定义归档格式,改参数指定压缩的单个表数据段,并且默认用中等水平压缩。对于纯文本输出,设置一个非零的压缩级别会导致全部输出文件被压缩,默认不压缩。tar +归档格式目前不支持压缩。 + +--binary-upgrade:专为升级工具准备的。 + +--inserts:insert命令输出数据,默认使用 copy +命令输出数据,这个选项主要用于将数据加载到非 PostgreSql +数据库。该选项为每一行生成一个 insert +命令,因此恢复时非常缓慢,但当数据库恢复时遇到一行错误时,它将仅丢失一行数据而不是全部的表内容。若目标端字段与源端字段顺序不一致,恢复可能完全失败,此时可使用 +\--column-inserts 选项。 + +--column-inserts 或 -attribute-inserts:显式指定字段名输出数据(insert +into table(column1,......)values(......))。 + +--disable-dollar-quoting:关闭美元符号界定函数体。强制函数体内容用 SQL +标准的字符串语法的引号包围。 + +--disable-triggers:仅对纯文本格式有意义,只和创建仅有数据的输出相关。在恢复数据时,临时关闭目标表上的触发器。目前,发出 +\--disable-triggers命令的必须是超级用户,执行输出脚本时,应用 -S +执行一个超级用户的名称。 + +--lock-wait-timeout=timeout:等待表锁,超时失败。 + +--no-tablespaces:仅对纯文本格式有意义,不输出命令来选择表空间。 + +--use-set-session-authorization:使用 set session authorization +命令来代替 alter owner 命令设置所有权。 + +pg_restore + +使用pg_dump的自定义备份或者tar类型的备份需要使用pg_restore工具来恢复。 + +命令格式: + +pg_restore\[选项\]...\[文件名\] + +常用选项: + +![](media/document_image_rId15.png){width="6.3in" +height="4.902928696412949in"} + +操作: + +\--导出整个数据库 + +pg_dump -h localhost -U postgres(用户名) +数据库名(缺省时同用户名)\>/data/dum.sql + +#特别注意:数据库名称:pgtest与\'\>\' 之间不能存在空格 + +\--导出某个表 + +pg_dump -h localhost -U postgres(用户名) 数据库名(缺省时同用户名) -t +table(表名) \>/data/dum.sql + +#use + +pg_dump -h localhost -U postgres pgtest -t public.test_table\> +\~/dum_test_table.sql + +#注意:public.test_table中, \'public\'是模式名称, +\'test_table\'是模式中的表名称 + +\--导出某个模式 + +pg_dump导出public模式: + +pg_dump -h localhost -U postgres(用户名) 数据库名(缺省时同用户名) -s +public(模式名称) \>/data/dum.sql + +\-- use + +pg_dump -h localhost -U postgres pgtest -s public\> /home/lpf/public.sql + +\--备份schema + +pg_dump -d chis -n icuis \> chis_icuis.sql + +\--恢复schema + +\\i chis_icuis.sql + +\--pg_restore导出 + +pg_restore -h localhost -p 端口号 -U postgres -W -d us2011 -v +\"/root/us2010.backup\" + +物理备份 + +冷备份: + +把数据库停下来,再把数据库的pgdata目录拷贝下来就可以了。pgsql把与数据库实例有关的配置文件和数据文件都放在pgdata目录下,所以pgsql做冷备份比较简单。 + +热备份(在线备份): + +不停止数据库就能完成数据库的备份。在pg中的热备份有两种方法: + +![](media/document_image_rId16.png){width="6.3in" +height="0.9679461942257218in"} + +## PG中的执行计划 + +SQL语句执行计划是数据库为运行SQL语句而执行的操作步骤序列。  执行计划是 +SQL性能分析及调优的核心,  执行计划显示以下信息: + +SQL语句引用的表的顺序 + +SQL语句中每个表的访问方法 + +针对SQL语句中连接操作相关表的连接方法 + +where条件过滤、  order排序及count聚合等操作 + +![](media/document_image_rId17.png){width="5.9375in" +height="2.4791666666666665in"} + +EXPLAIN statement: +只生成执行计划,不实际执行。其中statement代表SQL语句。 + +EXPLAIN ANALYZE +statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。 + +verbose:显示额外的信息,尤其是计划树中每个节点的字段列表,schema识别表和函数名称。总是打印统计数据中每个触发器的名字 + +costs:包括每个计划节点的启动成本预估和总成本的消耗,也包括行数和行宽度的预估 + +buffers:使用信息,特别包括共享块命中、读、脏和写的次数。本地块命中、读、脏和写,临时块读和写的次数。 + +timing:在输出中包含实际启动时间和每个节点花费的时间,重复读系统块在某些系统上会显著的减缓查询的速度,只在analyze也启用的时候使用 + +format:声明输出格式,可以为text、xml、JSON或YAML,默认text + +explain输出结果解释: + +![](media/document_image_rId18.png){width="6.3in" +height="1.1845253718285214in"} + +Seq Scan on +test_23表示顺序扫描表test_23,顺序扫描也是全表扫描,即从头到尾扫描表。 + +![](media/document_image_rId19.png){width="6.3in" +height="0.4357338145231846in"}可以分为三部分: + +- cost:第一个数字表示启动的成本,也就是返回第一行需要多少cost值,第二个数字表示返回所有数据的cost。默认cost值如下: + +顺序扫描一个数据块,cost值定位1,参数为sql_page_cost + +随机扫描一个数据块,cost值定为4,参数为random_page_cost + +处理一个数据行的CPU,cost为0.01,参数为cpu_tuple_cost + +处理一个索引行的CPU,cost为0.005,参数为cpu_index_tuple_cost + +每个操作符的CPU代价为0.0025,参数为cpu_operator_cost + +row:表示会返回多少行 + +width:表示每行平均宽度为多少字节 + +explain使用示例: + +默认情况下,输出的执行计划是文本格式,但也可以输出json格式: + +![](media/document_image_rId20.png){width="6.3in" +height="4.025674759405074in"} + +也可以输出xml格式: + +![](media/document_image_rId21.png){width="6.3in" +height="2.869452099737533in"} + +还可以输出yaml格式: + +![](media/document_image_rId22.png){width="6.3in" +height="2.4117180664916886in"} + +加上analyze参数后,可通过实际执行来获取更精确的执行计划,命令如下: + +![](media/document_image_rId23.png){width="6.3in" +height="0.9597648731408573in"} + +加了analyze参数后,可以看到实际的启动时间(第一行返回的时间)、执行时间、实际扫描行数(actual +time=0.010..0.011 rows=4 +loops=1,其中启动时间为0.010ms,返回所有行的时间为0.011ms,返回的行数是4)。 + +analyze选项也可以使用另一种语法: + +![](media/document_image_rId24.png){width="6.3in" +height="0.9056244531933508in"} + +如果只想查看执行的路径情况,不看cost值,可以加(costs false)选项: + +![](media/document_image_rId25.png){width="6.3in" +height="1.1598829833770778in"} + +联合使用analyze和buffers选项,可通过实际执行来查看实际的代价和缓冲区命中的情况,如下: + +![](media/document_image_rId26.png){width="6.3in" +height="0.9942180664916885in"} + +因为加了buffers选项,执行计划的结果中就会出现一行,Buffers:shared +hit=1,这行中,shared hit=1表示在共享内存中直接读到了1个块。 + +执行计划的含义 + +Seq Scan:全表扫描 + +Index Scan:索引扫描 + +Bitmap Heap Scan:位图扫描 + +Filter:条件过滤 + +Nestloop +Join:嵌套循环连接,是在两个表做连接时,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大,要把返回结果集较小的表作为外表,而且在内表的连接字段上要有索引,否则会很慢。 + +Hash +Join:使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。适用于较小的表可以完全放入内存中的情况。 + +Merge +Join:如果源数据上有索引,或者结果已经被排序。在执行排序合并连接时就不需要排序了。 + +与执行计划相关的配置项 + +1、enable_参数 + +一般不需要选择改变以下参数的默认值 + +![](media/document_image_rId27.png){width="6.3in" +height="3.099329615048119in"} + +2、cost基准值参数 + +执行计划在选择最优路径时,不同路径的cost值只有相对意义。 + +默认情况下,他们以顺序扫描一个数据块的开销作为基准单位,即:将顺序扫描的基准参数seq_page_cost=1.0,其他开销的基准参数都对照他来设置 + +理论上也可以使用其他基准方法,若以毫秒级的实际执行时间为基准,可能会复杂些 + +eg:COST基准值参数如下: + +(1)seq_page_cost一般作为基准,不变 + +(2)若在读数据时,数据基本都在内存中,此时随机读和顺序读的差异不大,则random_page_cost可以设置小一点;若想让优化器则索引,不走全表扫描,可以把其值调大。 + +![](media/document_image_rId28.png){width="6.3in" +height="2.6966207349081364in"} + +3、基因查询优化GEQO的参数 + +使用探索式搜索来执行查询规划的算法 + +- GEQO的检索是随机的,它生成的执行计划可能会有不确定性 + +- 当关联查询表的数目\