目录
一、文档说明... 1
二、操作系统版本查询与yum源配置... 1
>服务端... 1
>客户端... 2
三、PostgreSQL检查与卸载... 3
1) PostgreSQL检查... 3
2) Postgresql卸载... 3
四、PostgreSQL10 Yum安装与部署... 4
五、启动并测试数据库... 6
六、配置虚拟机网络... 7
七、Python安装... 12
八、远程访问服务端数据库服务... 13
九、PostgreSQL11 源码安装与部署... 14
十、Windows安装PostgreSQL13. 17
十一、POSTGRES主从数据同步... 19
十二、POSTGRES自动化安装脚本... 19
十三、POSTGRES运维备忘... 19
1.导出导入PG数据表... 19
2.删除带有特定标识的表... 20
3.复制PG数据... 20
4.检查PG中是否有空表... 21
5.PG导入数据表到GreenPlum... 22
6.新增数据库用户... 22
7.修改数据表所有者... 24
使用一台操作系统为CentOS7的虚拟机安装部署数据库PostgreSQL, 启动并初始化PostgreSQL后作为数据库服务端;再使用另一台操作系统为Ubuntu16的虚拟机作为客户端通过Python访问服务端的数据库服务。
1) 操作系统版本及网络地址查询
2) yum源配
,系统启动后光驱设备会自动挂载,如下图所示。如果系统版本不支持光驱设备自动挂载,则需手动挂载,操作如下:
①查找光驱文件: /dev/cdrom
注:由于本系统做了软连接,所以/dev/cdrom与/dev/sr0所用光驱文件一致。
②建立光驱挂载文件夹: mkdir /mnt/centos
③将光驱文件挂载至已建光驱文件夹:mount /dev/cdrom /mnt/centos
2.本地拷贝保留CentOS7镜像文件并配置本地yum源
[root@hadoop1 ~]# mkdir /mnt/centos7
[root@hadoop1 ~]# cd /run/media/june/CentOS\ 7\ x86_64/
[root@hadoop1 ~]# cp -r * /mnt/centos7/
[root@hadoop1 ~]# cd /etc/yum.repos.d/
[root@hadoop1 ~]# touch CentOS-Local.repo
在/etc/yum.repos.d/目录下新建一个文件CentOS-Local.repo并配置如下,baseurl为本地保留的镜像文件地址,enabled=1表示启用该yum源
[root@hadoop1 ~]# yum list 查看软件包列表
注:使用yum help学习yum命令和参数设置,所有安装记录日志保留在/etc/yum.conf指定的logfile=/var/log/yum.log文件中。
操作系统版本及网络地址查询
当前系统使用Postgresql服务器版本与psql版本不一致,如下图所示,Postgresql服务器使用9.5版本,而系统默认psql为9.2版本
该问题解决办法如下:
① 通过find / -name psql 查找系统所有psql版本配置路径
② 重命名当前psql为psql9.2后建立一个软连接使当前psql配置路径指向pgsql-9.5对应的psql
③ 再次检查psql版本和postgres服务,如图psql版本与postgresql服务器版本一致
①删除postgresql所有相关软件包yum remove postgre*,包括postgresql9.5版本和postgresql9.2版本,已删除的软件包信息写入日志/var/log/yum.log
②删除相关目录文件, 安装目录文件/usr/pgsql*与数据目录文var/lib/psql
③删除postgresql相关用户组和用户
1) 登录 PostgreSQL: Linux downloads (Red Hat family)
2) 选择PostgreSQL版本为10,平台操作系统为CentOS7,x86架构为64位,根据官网建议安装最新系统仓库RPM包,客户端软件包和服务端软件包
[root@hadoop1 ~]# yum install Index of /pub/repos/yum/
reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@hadoop1 ~]# yum install postgresql10
[root@hadoop1 ~]# yum install postgresql10-server
安装完毕后即可查看当前版本为PostgreSQL10.11
3) 初始化数据库
数据库初始化会在/var/lib/pgsql目录下创建名称为10的文件夹,10为数据库版本号,该文件夹中有data文件夹;默认会创建一个名为postgres的系统用户,可以通过passwd命令修改其密码
4) 设置开机自启
[root@hadoop1 ~]# systemctl enable postgresql-10.service
5) 启动数据库服务,查看数据库服务
[root@hadoop1 ~]# systemctl start postgresql-10.service
[root@hadoop1 ~]# systemctl status postgresql-10.service
6) 检查数据库服务的进程与端口
ps -ef | grep postgres
netstat -anp | grep 5432
1) 开启远程访问
vi /var/lib/pgsql/10/data/postgresql.conf
修改#listen_addresses = 'localhost' 为 listen_addresses='*'
当然,此处‘*’也可以改为任何你想开放的服务器IP
2) 信任远程连接
vi /var/lib/pgsql/10/data/pg_hba.conf
修改IPv4 本地连接地址127.0.0.1/32为0.0.0.0/0,对应连接方式改为md5验证方式
3) 打开防火墙
CentOS 防火墙中内置了PostgreSQL服务,根据/usr/lib/firewalld/services/postgresql.xml配置文件提示,需放开防火墙端口5432/tcp,开放postgres服务,执行如下:
systemctl status firewalld
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload 重载防火墙
firewall-cmd --list-all 查看防火墙
4) 重启PostgreSQL服务
systemctl restart postgresql-10.service
5) 连接默认的postgres数据库并修改用户名为postgres的密码
6) 创建并测试数据库
首先创建一个新用户shu赋予其超级用户权限并更改其口令,再创建数据库shudb使shu能操作该数据库
用户shu登录数据库shudb,创建mytable表并测试基础sql功能
1) CentOS与Ubuntu虚拟机网络连接模式都设置为桥接模式
首先作为数据库服务端的虚拟机CentOS7与作为数据库客户端的虚拟机Ubuntu16都需要采用桥接的网络连接方式,在虚拟机启动前选择虚拟机--设置--网络适配器--网络连接并勾选桥接模式,确认后再启动虚拟机
虚拟机三种网络连接模式的区别:(自己的理解,可能不准确~)
①桥接模式:直接连接物理网络,虚拟机网络使用与主机网络(192.168.124.7/24)同网段的IP地址,并且通过自己的IP地址访问外网
②NAT模式:用于共享主机的IP地址,虚拟机的网络使用主机网络的一个子网IP地址,能够访问外网,但是通过主机的IP地址访问外网
③仅主机模式:与主机共享的专用网络,不能访问外网
Win7主机网络:IPv4 192.168.124.7/24
>服务端
CentOS7.4网络: IPv4 192.168.124.49/24
>客户端
Ubuntu16.4 网络:IPv4 192.168.124.50/24
2) 将作为数据库服务器的CentOS网络改为静态网络地址
先将网卡ens33断开,修改配置文件ifcfg-ens33,保存修改内容后再连接网卡ens33,最后重启一下网络即可
注:重启网络的命令建议使用service network restart
当前使用网卡ens33的配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
原动态IP配置如下
修改为静态IP后配置如下
3) 测试网络
Ping外网能通,如百度首页IP 180.101.49.12 但执行yum install postgresql10-devel报错
检查yum源配置无误后清理yum缓存再重新创建元数据缓存yum clean all
yum makecache,继续报错如下
根据网友建议修改文件/etc/resolv.conf,新增两个域名服务地址,并将该地址加入当前使用网卡ens33的配置文件
[root@hadoop1 ~]# vi /etc/resolv.conf
[root@hadoop1 ~]# ifdown ens33
[root@hadoop1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop1 ~]# ifup ens33
[root@hadoop1 ~]# service network restart
/etc/sysconfig/network-scripts/ifcfg-ens33最新配置信息如下所示,新增DNS1=8.8.8.8与DNS2=8.8.4.4
最后能正确执行以下yum命令,不提示错误
建议安装postgresql10-contrib与postgresql10-devel
yum makecache
yum install postgresql10-contrib
yum install postgresql10-devel
1) CentOS7安装Python 2.7.5
①获取安装包
由于虚拟机的网络采用桥接模式,所以直接可以使用curl或者wget命令获得外网资源,如setuptools与pip安装包。如果本地有安装包,那借用ftp或者filezilla等文件传输工具上传即可,建议使用tar.gz类型安装包,如图pip-1.5.4.tar.gz与setuptools-2.0.tar.gz
②安装setuptools
[root@hadoop1 opt]# sudo tar -zxvf setuptools-2.0.tar.gz -C /opt
[root@hadoop1 opt]# cd setuptools-2.0/
[root@hadoop1 opt]# python setup.py build
[root@hadoop1 opt]# python setup.py install
③安装pip
[root@hadoop1 opt]# tar -xzvf pip-1.5.4.tar.gz –C /opt
[root@hadoop1 opt]# cd pip-1.5.4
[root@hadoop1 opt]# python setup.py install
[root@hadoop1 opt]# python -V
Python 2.7.5
④安装所需的python包,比如访问postgreSQL数据库需要的psycopg2
[root@hadoop1 pip-1.5.4]#pip install psycopg2
[root@hadoop1 pip-1.5.4]# find / -name psycopg2
/usr/lib64/python2.7/site-packages/psycopg2
2) Ubuntu16安装Python 2.7.5
root@ubuntu:~# sudo apt-get install python
root@ubuntu:~# sudo apt-get install libpq-dev python-dev
root@ubuntu:~# sudo apt-get install python-pip
root@ubuntu:~# pip install psycopg2
1) Ubuntu虚拟机远程访问数据库服务
将服务器上的python连接数据库的脚本上传到客户端,上传成功后修改脚本的host地址,将之前本地访问时设置的127.0.0.1改为服务器端的虚拟机地址192.168.124.49
root@ubuntu:~# scp [email protected]:/opt/postgresqlConnect.py /opt/
root@ubuntu:~# vi /opt/postgresqlConnect.py
Python 安装psycopg2后即可运行该数据库访问脚本,成功获取远程数据库服务
2) 主机远程访问PostgreSQL数据库服务
检查服务器上postgres服务已开启,主机通过Navicat成功远程访问服务器上的数据库服务,如图所示
使用源码安装PG11.5
postgresql源码安装 - monkey6 - 博客园
安装依赖包
yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake
安装配置
./configure --prefix=/usr/local/pgsql-11.5 --with-wal-segsize=512 --with-wal-blocksize=16 --with-pgport=5432 --with-segsize=1 --with-blocksize=8 --with-libedit-preferred --with-perl --with-openssl --with-libxml --with-libxslt --enable-thread-safety --enable-nls=en_US.UTF-8
编译 make
安装 make install
[root@node7 opt]# useradd postgres
[root@node7 opt]# mkdir pgdata
[root@node7 opt]# chown -R postgres:postgres pgdata/
[root@node7 local]# ln -sf /usr/local/pgsql-11.5/ /usr/local/pgsql
[root@node7 local]# su - postgres
[postgres@node7 ~]$ . ~/.bashrc
export PGDATA=/opt/pgdata
export PGHOME=/usr/local/pgsql
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib
export PATH=$PATH:$PGHOME/bin
[postgres@node7 ~]$ initdb
[postgres@node7 ~]$ pg_ctl -D /opt/pgdata -l logfile start
waiting for server to start.... done
server started
PostgreSQL数据库创建一个postgres用户作为数据库的管理员,密码随机,所以需要修改密码,方式如下:
1.下载与安装pg
Download PostgreSQL 下载pg
PostgreSQL10.5安装详细步骤(Win10)_DrugAI的博客-CSDN博客_postgresql win10 安装 安装pg
2.设置环境变量
PG_HOME D:\BASKET\postgresql13
PGDATA %PG_HOME%\data
path %PG_HOME%\bin
3.注册windows服务
pg_ctl.exe register -N "postgres" -D "D:\BASKET\postgresql-13.0.1\data"
删除系统服务
sc delete 服务名
重新注册,正确安装成功后,pg服务会自动在系统服务中进行注册。
pg_ctl.exe register -N "postgres" -D "D:\BASKET\postgresql13\data" ——无需执行
4. navicat连接pg数据库测试
数据库: postgres
用户名:postgres
密码:postgres
5. pgAdmin
十一、POSTGRES主从数据同步
请参考文档:http://t.csdn.cn/EL6mP
###采用源码包安装postgres###
############################
#!/bin/bash
if [ $(id -u) != "0" ]; then
echo "Error: You must be root to run this script, please use root to install"
exit 1
fi
echo "Please download the version of postgres from https://www.postgresql.org/ftp/source/"
## Update below messages about where you get the package and where you want to install
dir_package='/md5'
install_package=${dir_package}'/postgresql-11.5.tar.gz'
package_version='postgresql-11.5'
## create user mysql and paths /md5/postgres and /md5/postgres/pgdata
useradd postgres
mkdir -p /md5/postgres
mkdir -p /md5/postgres/pgdata
pg_home='/md5/postgres'
pg_data='/md5/postgres/pgdata'
## The default linux system version is Redhat/CentOS7
clear
echo "=========================================================================="
echo "A tool to auto-compile & install $package_version on Redhat/CentOS7 Linux "
echo "=========================================================================="
## 1. preparations for postgres installation
echo ">>Step1: postgres安装准备中..."
echo ">>Step1-1: install the packages depeneded on"
##如果没有root权限,可以跳过以下依赖包的安装,如果后续安装报错再手动添加相关依赖包
##yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake
echo ">>Step1-2: decompress the install package"
package_tar_name=${install_package##*/}
package_name=${package_tar_name%%.tar*}
## decompress the install package
tar zxvf $package_tar_name -C ${dir_package}/
## assign the port for postgres installation
read -p "Tell me a viable port you'd like to install postgres (the default port is 5432):" port
if [ ! ${port} ];then
mport=5432
elif [ !`${port} -eq 5432` ];then
mport=${port}
fi
echo "The port="${mport}
## 2. start postgres installation
echo ">>Step2: 开始安装$package_version"
echo "We are about to install $package_version, please wait..."
echo ">>Step2-1: 配置(--prefix——指定安装目录,--with-pgport——指定启动端口)"
cd ${dir_package}/${package_name}/
./configure --prefix=${pg_home} --with-pgport=${mport}
echo ">>Step2-2: 编译与安装"
make && make install
## 3. initial and start postgres
echo ">>Step3: postgres的初始化与启动"
chown -R postgres:postgres ${pg_home}
echo ">>Step3-1: postgres初始化"
su - postgres -s /bin/bash -c "${pg_home}/bin/initdb -D ${pg_data}"
echo ">>Step3-2: 启动postgres"
su - postgres -s /bin/bash -c "${pg_home}/bin/pg_ctl -D ${pg_data} -l logfile start"
if [ `ps -ef | grep postgres | grep -v grep | wc -l` -eq 0 ]
then
echo "Postgres started failed"
else
echo "Postgres started successfully"
fi
## 4. 设置环境变量使用psql连接数据库
## echo `export PGHOME=${pg_home}` >> /home/postgres/.bashrc
## echo `export PGDATA=${pg_data}` >> /home/postgres/.bashrc
## echo `export PATH=$PATH:${PGHOME}/bin` >> /home/postgres/.bashrc
## source /home/postgres/.bashrc
## su - postgres
## psql --help
## psql -h localhost -U postgres
## postgres=# alter user postgres with password 'postgres';
## postgres=# \q
## 5. 打开防火墙端口
## systemctl status firewalld
## firewall-cmd --permanent --add-port=5432/tcp
## firewall-cmd --reload 重载防火墙
## firewall-cmd --list-all 查看防火墙
##6. pg扩展插件安装
##cd ${dir_package}/${package_version}/contrib/
##make && make install
##安装完成后可以在${pg_home}/share/extension/ 目录下查看到
##7. 修改pg用户密码 —— 即使设置了密码,选择带密码的连接方式时不输入或者输错密码也可以正常连接上的,这个为啥?
##[postgres@centos7-min7 contrib]$ psql -W
##Password:
##psql (11.5)
##Type "help" for help.
##postgres=# \password
##Enter new password: 123456
##Enter it again:
sudo su - postgres
pg导出数据库testdata以st开头的表
pg_dump -U postgres -t 'st*' testdata > st.sql
pg导出数据库testdata不以st开头的表
pg_dump -U postgres -T 'st*' testdata > no_st.sql
只导出表结构,不导数据
pg_dump -U postgres -t -s 'st*00' testdata > st00.sql
导入pg文件
psql -d testdata -U postgres -f st.sql > st.log
truncate table 表名;
select * from pg_database where datname='testdata';
psql -d 'testdata' -c "select distinct(table_name) from information_schema.columns where table_name LIKE '%202001%';" > /home/postgres/temp.txt
cat /home/postgres/temp.txt | while read line
do
psql -d 'testdata' -c "drop table $line;"
done
[root@node8 data]# cat copy_pg_data.sh
#!/bin/bash
filename=table_list.txt
psql -d testdata -U postgres -c "\d"|awk '{print $3}'|grep 20200402 > table_list.txt
for line in `cat ./${filename}`
do
new_name=${line/20200402/20200430}
table_name=${new_name%_*}
file_date=${new_name##*_}
#echo ${new_name} ${file_date} ${table_name}
psql -d testdata -U postgres -c "drop table if exists ${new_name};create table if not exists ${new_name} partition of ${table_name} for values in ('${file_date}');"
#echo "create table if not exists ${new_name} partition of ${table_name} for values in ('${file_date}');" >> create.log
psql -d testdata -U postgres -c "\copy ${line} to ${new_name}.data"
sed -i "s/20200402/20200430/g" ${new_name}.data
psql -d testdata -U postgres -c "\copy ${new_name} from ${new_name}.data"
#echo "success ${new_name}" >> success.log
done
rm -rf *.data
#!/bin/bash
##get tables list from db
db="postgres"
/usr/pgsql-10/bin/psql -h 192.168.20.71 -p 5432 -U postgres -d ${db} -c "\d" >tablesName.txt
num=`cat tablesName.txt | awk '{if($3!="") print $3}' | wc -l`
numm=$(($num-2))
echo "database num="$numm
rm -rf tablesWithCounter.txt
for((n=3;n<=$num;n++))
do
table=`cat tablesName.txt | awk '{if($3!="") print $3}' | sed -n $n'p'`
echo $table >> tablesWithCounter.txt
#/usr/pgsql-10/bin/psql -h 192.168.20.71 -p 5432 -U postgres -d ${db} -c "if (select count(*) as counter from $table ==0) then select $table from pg_tables" >>tablesWithCouter.txt
/usr/pgsql-10/bin/psql -h 192.168.20.71 -p 5432 -U postgres -d ${db} -c "select count(*) as counter from $table" >> tablesWithCounter.txt
done
tableindex=0
cat tablesWithCounter.txt | while read line
do
((tableindex=$tableindex+1))
#tbname="$line" |cut -c 1-2
if [[ "$line" == "da"* ]]
then
tbname=$line
#echo $tableindex+"@"+$tbname
index1=$tableindex
fi
if [[ "$line" == "0" ]]
then
tbnull=$line
#echo $tableindex+"@"+$tbnull
index2=$tableindex
if [[ (($index2-$index1==3)) ]]
then
echo $tbname $tbnull
fi
fi
done
#!/bin/bash
##/usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data/
#pg导入数据表到gp
#/usr/pgsql-10/bin/pg_dump -h 192.168.20.71 -p 5432 -U postgres -C -E UTF-8 -t datatest -d postgres | psql -h 192.168.20.73 -p 5432 -U postgres -d postgres
#/usr/pgsql-10/bin/psql -h 192.168.20.71 -p 5432 -U postgres -d postgres -c "select * from datatest" > temp.txt
##get tables list from db
db="postgres"
/usr/pgsql-10/bin/psql -h 192.168.20.71 -p 5432 -U postgres -d ${db} -c "\d" >temp.txt
num=`cat temp.txt | awk '{if($3!="") print $3}' | wc -l`
numm=$(($num-2))
echo "database num="$numm
for((n=3;n<=$num;n++))
do
table=`cat temp.txt | awk '{if($3!="") print $3}' | sed -n $n'p'`
echo $table
/usr/pgsql-10/bin/pg_dump -h 192.168.20.71 -p 5432 -U postgres -C -E UTF-8 -t ${table} -d postgres | psql -h 192.168.20.73 -p 5432 -U postgres -d postgres
done
[postgres@hjr26 opt]$ psql -d postgres
postgres=# create user work superuser password 'xxxxx';
[postgres@hjr26 opt]$ psql -d postgres -U work
postgres=# create database testdata;
postgres=# \l
postgres=# \du
postgres=# \c testdata
You are now connected to database "testdata" as user "work".
testdata=# \d
Did not find any relations.
publicbigdata=# alter table channel_cell owner to work;
ALTER TABLE
publicbigdata=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------------+-------+----------
public | channel_cell | table | work