博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL附属库complete fresh简单实现
阅读量:6582 次
发布时间:2019-06-24

本文共 2106 字,大约阅读时间需要 7 分钟。

可能出于某种目的,需要把一个PG数据库整个的复制到另一个数据库。

实现方法非常多,如:(第一个和第三个都需要注意reference关系)

1.使用DB_LINK打通两个数据库,这个的话也是比较通用的,缺点是要编译一下源码并安装DB_LINK套件。

2.使用pg_dump管道连接两个数据库直接导入到附属库

3.使用SHELL脚本实现

今天的话主要介绍一下使用SHELL脚本来实现附属库的数据传入

主库A放在上海IDC,使用postgresql8.3

附属库B放在香港IDC,使用的是POSTGRESQL8.4,假设已经有了与A库相同的DDL在某SCHEMA下面

步骤:

1.首先是在A库上建立一个只读用户,赋予需要被复制的表,数据库,SCHEMA只读权限。配置PG_HBA开放这个只读用户的访问权限

2.在B库服务器上配置一个.pgpass文件,放上连接A库的只读用户密码,这样的话在B库连接A库就不需要输密码了

3.在B库上编写2个SHELL脚本,就开搞了

第一个脚本是执行实体(关键字需要用引号)

#!/bin/bash

. /home/postgres/.bash_profile

if [ $# -ne 2 ]; then

echo -e “parameter error”

exit 1

fi

TABLE_NAME=$1

address_tbl_COL=”\”type\”, xxx, xxx”

message_tbl_COL=”id, xxx, xxx, xxx, \”type\”"

rp_newaccess_20100301_COL=”xxx, xxx, xxx, xxx”

tbl_action_log_COL=”id, xxx, xxx, xxx, xxx, xxx,objid”

eval TABLE_COL=”$”${TABLE_NAME}_COL

if [ $2 == "TRUNCATE" ]; then

psql -h /tmp -p 1921 -U user -d dbname -c “truncate table ${TABLE_NAME} CASCADE”

exit

fi

if [ $2 == "INSERT" ]; then

psql -h ***.***.***.*** -p 1921 -U user -d dbname -c “copy schema.${TABLE_NAME} (${TABLE_COL}) to stdout”|psql -h /tmp -p 1921 -U user -d dbname -c “copy ${TABLE_NAME} (${TABLE_COL}) from stdin”

exit

fi

exit

第二个脚本是执行外壳

#!/bin/bash

. /home/postgres/.bash_profile

# 判断是否已经在运行

test -f /home/postgres/script/run/db_xxx_sync_entry.run

if [ $? -eq 0 ]; then

exit 3

fi

# 生产在运行标记

touch /home/postgres/script/run/db_xxx_sync_entry.run

/home/postgres/script/db_xxx_sync.sh address_tbl TRUNCATE

/home/postgres/script/db_xxx_sync.sh message_tbl TRUNCATE

/home/postgres/script/db_xxx_sync.sh rp_newaccess_20100301 TRUNCATE

/home/postgres/script/db_xxx_sync.sh tbl_action_log TRUNCATE

/home/postgres/script/db_xxx_sync.sh address_tbl INSERT

/home/postgres/script/db_xxx_sync.sh message_tbl INSERT

/home/postgres/script/db_xxx_sync.sh rp_newaccess_20100301 INSERT

/home/postgres/script/db_xxx_sync.sh tbl_action_log INSERT

vacuumdb -ze -d dbname

# 删除运行标记

sleep 10

rm -f /home/postgres/script/run/db_xxx_sync_entry.run

4.创建相关目录,把脚本放进去就OK了

su – postgres

mkdir -p ~/script/run

剩下的事情就是,直接调用外壳就OK了,数据会自动添加进来。下次要添加表或者是更新了字段的话修改一下第一个脚本就可以了。

如果数据量比较大的情况下,可以在SHELL里面加上一些异常处理,邮件通知等等,随时掌握复制进度和健康状况。

转载地址:http://visno.baihongyu.com/

你可能感兴趣的文章
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
我的友情链接
查看>>
监听在微信中打开页面时的自带返回按钮事件
查看>>
第一个php页面
查看>>
世界各国EMC认证大全
查看>>
最优化问题中黄金分割法的代码
查看>>
在JS中使用Ajax
查看>>
Jolt大奖获奖图书
查看>>
ubuntu 16.04 安装PhpMyAdmin
查看>>
设置分录行按钮监听事件
查看>>
java并发库之Executors常用的创建ExecutorService的几个方法说明
查看>>
23种设计模式(1):单例模式
查看>>
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
查看>>
SpringBoot实战总汇--详解
查看>>