1. 总结pg和mysql的优劣势。
MySQL的主要优势如下:
- 运行速度快,MySQL体积小,命令执行的速度快。
- 使用成本低。MySQL是开源的,且提供免费版本,对大多数用户来说大大降低了使用成本。
- 使用容易。与其他大型数据库的设置和管理相比,其复杂程度较低,易于使用。
- 可移植性强。MySQL能够运行与多种系统平台上,如windouws,Linux,Unix等。
- 适用更多用户。MySQL支持最常用的数据管理功能,适用于中小型企业甚至大型网站应用。
MySQL相对于PostgreSQL的劣势:
MySQL | PostgreSQL |
最重要的引擎InnoDB很早就由Oracle公司控制。目前整个MySQL数据库都由Oracle控制。 | BSD协议,没有被大公司垄断。 |
对复杂查询的处理较弱,查询优化器不够成熟 | 很强大的查询优化器,支持很复杂的查询处理。 |
只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。 | 都支持 |
性能优化工具与度量信息不足 |
提供了一些性能视图,可以方便的看到发生在一个表和索引上的select、delete、update、insert统计信息,也可以看到cache命中率。网上有一个开源的pgstatspack工具。 |
InnoDB的表和索引都是按相同的方式存储。也就是说表都是索引组织表。这一般要求主键不能太长而且插入时的主键最好是按顺序递增,否则对性能有很大影响。 |
不存在这个问题。 |
大部分查询只能使用表上的单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。 |
不存在这个问题 |
表增加列,基本上是重建表和索引,会花很长时间。 |
表增加列,只是在数据字典中增加表定义,不会重建表 |
存储过程与触发器的功能有限。可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱 |
除支持pl/pgsql写存储过程,还支持perl、python、Tcl类型的存储过程:pl/perl,pl/python,pl/tcl。 也支持用C语言写存储过程。 |
不支持Sequence。 |
支持 |
不支持函数索引,只能在创建基于具体列的索引。 不支持物化视图。 |
支持函数索引,同时还支持部分数据索引,通过规则系统可以实现物化视图的功能。 |
执行计划并不是全局共享的, 仅仅在连接内部是共享的。 |
执行计划共享 |
MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。 |
都支持 |
不支持用户自定义类型或域(domain) |
支持。 |
对于时间、日期、间隔等时间类型没有秒以下级别的存储类型 |
可以精确到秒以下。 |
身份验证功能是完全内置的,不支持操作系统认证、PAM认证,不支持LDAP以及其它类似的外部身份验证功能。 |
支持OS认证、Kerberos 认证 、Ident 的认证、LDAP 认证、PAM 认证 |
不支持database link。有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多 |
有dblink,同时还有一个dbi-link的东西,可以连接到oracle和mysql上。 |
Mysql Cluster可能与你的想象有较大差异。开源的cluster软件较少。 复制(Replication)功能是异步的,并且有很大的局限性.例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master. |
有丰富的开源cluster软件支持。 |
explain看执行计划的结果简单。 |
explain返回丰富的信息。 |
类似于ALTER TABLE或CREATE TABLE一类的操作都是非事务性的.它们会提交未提交的事务,并且不能回滚也不能做灾难恢复 |
DDL也是有事务的。 |
PostgreSQL主要优势:
- PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。oracle数据库不用说了,是商业数据库,不开放。而MySQL数据库虽然是开源的,但现在随着SUN被oracle公司收购,现在基本上被oracle公司控制,其实在SUN被收购之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的数据都是放在InnoDB引擎中的,反正我们公司都是这样的。所以如果MySQL的市场范围与oracle数据库的市场范围冲突时,oracle公司必定会牺牲MySQL,这是毫无疑问的。
- 与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MySQL下则比较困难。
- PostgreSQL源代码写的很清晰,易读性比MySQL强太多了,怀疑MySQL的源代码被混淆过。所以很多公司都是基本PostgreSQL做二次开发的。
- PostgreSQL在很多方面都比MySQL强,如复杂SQL的执行、存储过程、触发器、索引。同时PostgreSQL是多进程的,而MySQL是线程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是MySQL的线程无法充分利用CPU的能力。
PostgreSQL主要劣势:
- MVCC会生成多个版本,需要定期清理
- 扩容问题:扩容花费时间长
- 并发问题:用抢占资源方式,如有一个大SQL在执行,其它线程不能进行,但可设置优先级
- segment和mirror同步问题:某个实例有问题,在线恢复慢
MySQL相对于PG的优势
- innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触 发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。
- MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束。
- MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。
- MySQL相对于PG在国内的流行度更高,PG在国内显得就有些落寞了。
- MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
2. 总结pg二进制安装和编译安装。
二进制安装:
- 下载二进制安装包
- 解压安装包
- 配置环境变量
- 初始化数据库
- 修改配置文件
- 启动数据库
- 连接数据库
源码编译安装:
第一步:下载源代码
https ://www.postgresql.org/ftp/source/
第二步:编译安装。过程与Linux下其他软件的编译安装过程相同
./configure
make
make install
第三步:编译安装完成后执行如下步骤
使用initdb命令初使用化数据库
启动数据库实例
3. 总结pg服务管理相关命令 pg_ctl 和pgsql命令选项及示例和不同系统的初始化操作
pg_ctl 是一个实用的命令行工具,有以下常见功能:
初始化 PostgreSQL数据库实例
启动、终止或重启 PostgreSQL 数据库服务
查看 PostgreSQL数据库服务的状态
让数据库实例重新读取配置文件。允许给一个指定的PostgreSQL进程发送信号
控制 standby 服务器为可读写
在 Windows平台下允许为数据库实例注册或取消一个系统服务
#查看pg_ctl帮助
[12:11:03 postgres@rocky88 ~]$pg_ctl --help
pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.
Usage:
pg_ctl init[db] [-D DATADIR] [-s] [-o OPTIONS]
pg_ctl start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]
[-o OPTIONS] [-p PATH] [-c]
pg_ctl stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
pg_ctl restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
[-o OPTIONS] [-c]
pg_ctl reload [-D DATADIR] [-s]
pg_ctl status [-D DATADIR]
pg_ctl promote [-D DATADIR] [-W] [-t SECS] [-s]
pg_ctl logrotate [-D DATADIR] [-s]
pg_ctl kill SIGNALNAME PID
Common options:
-D, --pgdata=DATADIR