因为最近要做个数据研究,需要把数据入库,开源数据库中,同学们一般可能都会选择MysqL,不过MysqL 的一些函数能是在太累,因此我这边换成使用起来与oracle 更为相似的postgresql,近来这个数据库也是极其热门,上升速度很快。
下面做个编译与安装介绍,以下内容基本都来自德哥分享(http://blog.163.com/digoal@126/)的文档,感谢德哥的分享。
Postgresql下载网址:
http://www.postgresql.org/ftp/source/
这里我们选择最新的稳定版版postgresql-9.4.4 的源码版
https://ftp.postgresql.org/pub/source/v9.4.4/postgresql-9.4.4.tar.bz2
下载后解压
tar jxvf postgresql-9.4.4.tar.bz2
因为postgresql不能用root 用户启动,需要为他重新新建一个用户
创建用户
useradd pg944
进入下载的目录
cd postgresql-9.4.4
编译,这里设置安装目录
./configure --prefix=/home/pg944/pgsql
完成后执行
gmake world gmake install-world
下面初始化数据库相关配置
首先修改Linux内核相关参数调整
vi /etc/sysctl.conf
在最下面加上
kernel.shmmni = 4096 kernel.sem = 50100 64128000 50100 1280 fs.file-max = 7672460 net.ipv4.ip_local_port_range = 9000 65000 net.core.rmem_default = 1048576 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576
然后继续修改
vi /etc/security/limits.conf
在最下面加上
* soft nofile 131072 * hard nofile 131072 * soft nproc 131072 * hard nproc 131072 * soft core unlimited * hard core unlimited * soft memlock 50000000 * hard memlock 50000000
设置防火墙
vi /etc/sysconfig/iptables
加上端口,记得在端口22的那个设置下加,不要加到最下面
-A RH-Firewall-1-INPUT -p tcp -m tcp--dport 1999 -j ACCEPT
重启防火墙
service iptables restart
su - pg944
添加环境变量
vi ~/.bash_profile加上
export PGPORT=1999 export PGDATA=/home/pg944/pg_root export LANG=en_US.utf8 export PGHOME=/home/pg944/pgsql export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH export DATE=`date +"%Y%m%d%H%M"` export PATH=$PGHOME/bin:$PATH:. export MANPATH=$PGHOME/share/man:$MANPATH export PGUSER=postgres export PGHOST=$PGDATA alias rm='rm -i' alias ll='ls -lh' export PGDATABASE=postgres
保存设置
source ~/.bash_profile
初始化数据库
initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
这里要输入密码,和输入确认密码,输错会让你重新初始化
测试下
[pg944@slave1 ~]$ psql -V psql (Postgresql) 9.4.4
这个时候$PGDATA这里就可以看到数据库文件了。下面挑几个重要的说说
ll $PGDATA base -- 这个目录对应pg_default表空间 global --这个目录对应pg_global表空间,存放集群中的共享对象例pg_database表,(select relkind,relname from pg_class where reltablespace = (select oid from pg_tablespace where spcname=‘pg_global’) order by 1),包含控制文件等. pg_clog -- 存储事务提交状态数据 pg_hba.conf -- 数据库访问控制文件 pg_log -- 数据库日志目录(根据配置定义,可能没有这个目录) pg_multixact -- 共享行锁的事务状态数据 PG_VERSION -- 数据库版本 pg_xlog -- 存储WAL文件 postgresql.conf -- 配置文件 postmaster.opts -- 记录数据库启动时的命令行选项 postmaster.pid -- 数据库启动的主进程信息文件(包括$PGDATA目录,数据库启动时间,监听端口ipc信息等)
继续
cd $PGDATA
启动数据库前修改一下$PGDATA下面的pg_hba.conf和postgresql.conf
pg_hba.conf用于配置控制访问数据库的来源
这里为了方便设置对所有地址开放,很不安全
host all all 0.0.0.0/0 md5
postgresql.conf是数据库的主配置文件,最好也调整一下Linux内核参数.
下面内容会比较多
vi postgresql.conf
*****************************************************
监听IPv4的所有IP.
listen_addresses = '0.0.0.0'
最大允许1000个连接(测试的话100够了,加大连接数同时需要调整shared buffer).
max_connections = 100
为超级用户保留10个可用连接.
superuser_reserved_connections = 10
默认的unix socket文件放在/tmp,修改为$PGDATA,以确保本地访问的安全性.
unix_socket_directory = '.'
默认的访问权限是0777,修改为0700更安全.
unix_socket_permissions = 0700
TCP会话心跳包在Linux下面默认是2小时. 如果已经修改了系统的内核参数,则不需要再修改这里.
为防止客户端和服务端之间的网络设备主动关闭空闲TCP会话,设置以下参数.
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 6
大的shared_buffers需要大的checkpoint_segments,同时需要申请更多的System V共享内存资源. 并且增加共享内存管理的开销.
这个值不需要设的太大,因为Postgresql还依赖操作系统的文件系统cache来提高读性能,另外,写操作频繁的数据库这个设太大反而会增加checkpoint压力.
在9.4版本中会增加mmap以及huge page table的支持以减少内存管理的开销.
shared_buffers = 512MB
这个值越大,VACUUM,CREATE INDEX的操作越快,当然大到一定程度瓶颈就不在内存了,可能是cpu例如创建索引.
这个值是一个操作的内存使用上限,而不是一次性分配出去的. 并且需要注意如果开启了autovacuum,最大可能有
autovacuum_max_workers*maintenance_work_mem的内存被系统消耗掉.
maintenance_work_mem = 512MB
一般设置为比系统限制的略少,ulimit -a : stack size (kbytes,-s) 10240
max_stack_depth = 8MB
手动执行vacuum操作时,默认是没有停顿执行到底的,为了防止VACUUM操作消耗太多数据库服务器硬件资源,这个值是指vacuum在消耗多少资源后停顿多少时
间,以便其他的操作可以使用更多的硬件资源.
vacuum_cost_delay = 10ms
vacuum_cost_limit = 10000 # 1-10000 credits
默认bgwriter进程执行一次后会停顿200ms再被唤醒执行下一次操作,当数据库的写操作很频繁的时候,200ms可能太长,导致其他进程需要花费过多的时间来进行
bgwriter的操作. 短暂的停顿更利于将sharedbuffer中的脏块flush到磁盘,降低backend 主动flush 以申请共享内存的情形. 后面使用explain时会讲到.
bgwriter_delay = 10ms
另外还有几个和写脏块相关的参数,即写多少脏块后开始休息.
如果需要做数据库WAL日志备份的话至少需要设置成archive级别,如果需要做hot_standby那么需要设置成hot_standby,由于这个值修改需要重启数据库,所以先
设置成hot_standby比较好. 当然hot_standby意味着WAL记录得更详细,如果没有打算做hot_standby设置得越低性能越好.
wal_level = hot_standby
wal buffers默认是-1 根据shared_buffers的设置自动调整shared_buffers*3%.最大限制是XLOG的segment_size.
wal_buffers = 16384kB
多少个xlog file产生后开始checkpoint操作,
这个值越大,允许shared_buffer中的被频繁访问的脏数据存储得更久. 一定程度上可以提高数据库性能. 但是太大的话会导致在数据库发生checkpoint的时候需要
处理更多的脏数据带来长时间的IO开销(还要考虑bgwriter的存在).
太小的话会导致产生更多的WAL文件 (因为full page writes=on,CHECKPOINT后的第一次块的改变要写全块,checkpoint越频繁,越多的数据更新要写全块导致产
生更多WAL).
checkpoint_segments = 32
这个和checkpoint_segments的效果是一样的,只是触发的条件是时间条件.
checkpoint_timeout = 5min
archive_mode = on
这个是归档调用的命令,我这里用date代替,所以归档的时候调用的是输出时间而不是拷贝wal文件.
archive_command = '/bin/date' # 'cp %p/arch/%f'
如果要做hot standby这个必须大于0,并且修改之后要重启数据库所以先设置为32.
表示允许建立多少个和流复制相关的连接.
max_wal_senders = 32
这是个standby 数据库参数,为了方便角色切换,我一般是所有的数据库都把他设置为on 的.
hot_standby = on
这个参数是说数据库中随机的PAGE访问的开销占seq_page_cost的多少倍,seq_page_cost默认是1. 其他的开销都是seq_page_cost的倍数.
这些都用于基于成本的执行计划选择. 后面讲成本因子的调教时会详细说明.
random_page_cost = 2.0
effective_cache_size只是个度量值,不是实际分配使用的内存值.
表示系统有多少内存可以作为操作系统的cache. 越大的话,数据库越倾向使用index这种适合random访问的执行计划.
一般设置为内存大小减去数据库的shared_buffer再减去系统和其他软件所需的内存.
effective_cache_size = 12000MB
下面是日志输出的配置.
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log' #这里建议做修改,但得提前建好目录,并设置权限
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
这个参数调整的是记录执行时间超过1秒的sql到日志中,一般用于跟踪哪些sql执行时间长.
log_min_duration_statement = 1s
记录每一次checkpoint到日志中.
log_checkpoints = on
记录锁等待超过1秒的操作,一般用于排查业务逻辑上的问题.
log_lock_waits = on
deadlock_timeout = 1s
记录连接和端口连接,可以反映短连接的问题,同时也可以作为连接审计日志.
log_connections = on
log_disconnections = on
打开代码位置信息的输出,可以反映日志信息输出自哪个代码的什么函数.
在会话中可以使用\set VERBOSITY verbose开启
log_error_verbosity = verbose
记录DDL语句,但是需要注意的是,创建用户,修改密码的语句也会被记录,所以敏感sql执行前建议在会话中关闭这个审计.
log_statement = 'ddl'
这个原本是1024表示跟踪的sql在1024的地方截断,超过1024将无法显示全sql. 修改为2048会消耗更多的内存(基本可以忽略),不过可以显示更长的sql.
track_activity_query_size = 2048
默认autovacuum就是打开的,log_autovacuum_min_duration = 0记录所有的autovacuum操作.
autovacuum = on
log_autovacuum_min_duration = 0
*****************************************************************
psql -h 192.168.137.3 -p 1999 -U postgres
由于我是专注开发,因此喜欢用IDE去写sql,这里有个postgresql第三方开发工具,类似pl/sql
http://www.pgadmin.org/download/windows.php
成功连接
比如
下面创建一个表空间,这里的地址对应服务器里的文件夹。pg_test文件目录得提前创建。
create tablespace "pgtest"location '/home/pg944/pg_root/pg_test';
Ok,数据库装完,现在就可以愉快导数据进行开发了。