下载
从官网下载,地址:
https://www.postgresql.org/download/
不建议从中文社区下载。
从官网见面看,目前是提供两种安装模式,Packages和Source;
Packages就是yum或rpm安装,选择完成后就会显示安装scripts;按照提示完成安装即可。适合开发或学习使用。
Source适合生产环境使用。这里我们使用12版本为例
选择.bz2或.gz下载都可以,只是压缩方式不同。
下载好后上传至服务器。
OS环境配置
创建用户和组
建议非root用户管理,因此创建postgres用户:
user add postgres
passwd postgres
安装依赖包
yum groupinstall -y "Development Tools" "Legacy UNIX Compatibility"
yum install -y bison flex readline* zlib-devel gcc* gmake
创建目录并授权
一个是软件安装目录,一个是数据目录,
可以类比mysql的basedir和datadir;
mkdir -p /usr/local/pg12
mkdir -p /pgdata/12/data
chown -R postgres. /pgdata
chown -R postgres. /usr/local/pg12
chmod 700 /pgdata/12/data -R
操作系统参数优化
pg和oracle类似需要调一些内核参数,因为是多进程,对于内核参数的要求较多;这一点不同于mysql;
vim /etc/sysctl.conf
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
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
生效配置:
sysctl -p
限制参数:
vim /etc/security/limits.conf
* soft nofile 131072
* hard nofile 131072
* soft nproc 131072
* hard nproc 131072
* soft stack unlimited
* hard stack unlimited
* hard memlock 50000000
* soft memlock 50000000
建议关闭numa,设置IO策略未deadline(机械)或者noop(SSD):
一般在OS启动时bios使用numa off参数。
查看numa状态:
numactl --show
dmesg | grep -i numa
cat /proc/cmdline
在bios中将numa关闭:
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="numa=off"
或编辑/etc/default/grub,在在GRUB_CMDLINE_LINUX一栏添加numa=off;
重新生成 /etc/grub2.cfg 配置文件:
grub2-mkconfig -o /etc/grub2.cfg
重启服务器生效。
如果发现已经启用了numa又不能重启,也可以调整OS参数去修改
vim /etc/sysctl.conf
vm.zone_reclaim_mode = 0
kernel.numa_balancing=0
numactl --interleave=all pg_ctl start -D $PGDATA
其中vm.zone_reclaim_mode:当一个内存区域(zone)内部的内存耗尽时,是从其内部进行内存回收还是可以从其他zone进行回收的选项,0表示可以从下一个zone找可用内存;
kernel.numa_balancing:是否启用NUMA平衡功能,将任务移动到最近的内存或移动内存到任务执行最近的地方,0表上关闭;
numactl --interleave=all:无视 NUMA 关于 CPU 内存分配的策略,可以使得各个 CPU 区域的内存均匀分配。
查看IO策略,此处以xvda为例:
cat /sys/block/xvda/queue/scheduler
显示为deadline或noop都可以(算法不同,noop更倾向于饿死读而优先写,适合SSD)。避免使用cfq。
echo noop > /sys/block/xvda/queue/scheduler
重启后会失效,如果想持久化则需要将命令放在/etc/rc.local中,或者直接修改grub:
vim /etc/default/grub
在GRUB_CMDLINE_LINUX一栏添加elevator=noop,再重新生成grub2.cfg配置文件,方法类似上面关闭numa
或者:
grubby --update-kernel=ALL --args="elevator=noop"
重启生效。
源码安装
C的源码包需要编译安装。
上传软件解压
上传至/opt并解压:
tar -xf postgresql-12.12.tar.gz
cd postgresql-12.12
配置、编译、安装
./configure --help查看可定制的参数,其中打印的结果中--with类的都是打开一些功能,此外还有--without,--disable等,具体参考官网;
此处仅指定安装目录和端口,不指定的话默认端口是5432;这些参数后面初始化也可以指定;
./configure --prefix=/usr/local/pg12 --with-pgport=5432
#全部可用功能编译
gmake world
#把所有编译好的进行安装(建目录+拷贝)
gmake install -world
配置环境变量
su postgres
cd ~
vim .bash_profile
export PGDATA=/pgdata/12/data
export LANG=en_US.utf8
export PGHOME=/usr/local/pg12
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
source .bash_profile
检查版本
psql --version
如果正常显示说明环境变量配置成功。
初始化数据
su - postgres
简易初始化
initdb -D /pgdata/12/data -w
生产建议
initdb -A md5 -D $PGDATA -E utf8 --locale=C -W
-A 是加密方式
-D 是数据目录
-E 是字符集 (默认即utf8)
执行之后会提示输入密码。
启停数据库
可以按照初始化打印的结果来启动,完整命令:
pg_ctl -D /pgdata/12/data/ -l logfile start
如果配了环境变量也可以直接pg_ctl start来启动,因为pgdata能识别到;
重启:pg_ctl restart
关闭:pg_ctl stop
通过pg_ctl --help可以查看完整的选项,
其中关闭和重启选项中的shutdown modes包括smart、fast、immediate;
smart是最安全的关闭方法,等待所有客户端连接关闭之后才关闭;
fast是用的生产中最多的,自动杀掉连接,回滚未完成事务;
immediate相当于kill -9;
对应的语句:
pg_ctl -D /pgdata/12/data/ stop -ms
pg_ctl -D /pgdata/12/data/ stop -mf
pg_ctl -D /pgdata/12/data/ stop -mi
此外启动数据库还可以通过脚本启动,需要切换回root用户执行
/opt/postgresql-12.12/contrib/start-scripts/linux
使用此脚本需要修改脚本中prefix、PGDATA等内容。
登录数据库
刚装完仅允许本地socket连接,一般socket再/tmp目录下,是个隐藏文件;
直接输入psql,输入密码即可进入命令行,默认进入系统postgres这个库中;
简单操作:
\l
create database test1;
\c test1;
create table t1(id int);
insert into t1 values(1);
select * from t1;
其中\l查看所有库,\c使用某库,\d或\dt查看当前库下的表。
远程连接还需配置实力级别的访问控制:
cd $PGDATA
vim pg_hba.conf
host DBname username 10.10.10.0/24 md5
md5的未知写reject就不允许这一条登录;
如果两条有重叠,则按从上到下顺序读取,一旦一条生效,后面的则不会读到。
此外由于默认只监听本地,还需要配置linstener才能监听到,以全部监听为例:
vim postgresql.conf
listen_addresses = '0.0.0.0'
重启后生效:
pg_ctl restart -mf
用超管postgres以TCP/IP方式登录:
psql -d postgres -h 10.10.10.51 -p 5432 -U postgres
常用命令
查看psql命令行客户端相关命令:
\?
查看sql相关语句:
\h
列举库名,相当于show databases:
\l
其中默认库有postgres、template0、template1;
切换到某库,相当于use
\c db1
查看库下的表:
\d
\dt
看t1表结构:
\d t1
查看某语句的帮助,例如查看create user语句的帮助:
\help create user
查看用户权限信息:
\du
PG中元数据存在pg_开头的表中,如:
select * from pg_tables where schemaname not in ('pg_catalog','information_schema');
如将查询竖着显示,先执行\x,再执行查询;类似MySQL中的\G;
\x
网友评论