一、创建数据库,分配权限。
-- 先切换postgre
sql用户
sudo su - postgre
sql
mkdir /DATA/postgre
sql/tablespace/lcd
-- 连接
数据库
p
sql -p 5448
-- 创建
用户并
设置密码
create user lcd with password '666888';
-- 创建表空间 指定目录
create tablespace lcd owner lcd location '/DATA/postgre
sql/tablespace/lcd';
-- 创建
数据库 设置拥有者 和表空间 打开允许连接
CREATE DATABASE transfer_lcd WITH OWNER = lcd ENCODING = 'UTF8' TABLESPACE = lcd CONNECTION LIMIT = -1;
-- 配置权限
GRANT ALL PRIVILEGES ON DATABASE transfer_lcd to lcd;
REVOKE CONNECT ON DATABASE transfer_lcd FROM PUBLIC;
GRANT CONNECT ON DATABASE transfer_lcd TO lcd;
-- 分配允许连接给只读
用户
GRANT CONNECT ON DATABASE transfer_lcd TO transferreadonly;
-- 新建模式
CREATE SCHEMA mrsoft_lcd;
-- 分配模式所有权限给 lcd
用户
GRANT ALL ON SCHEMA mrsoft_lcdTO lcd;
-- 分配模式 USAGE 权限给 transferreadonly
GRANT USAGE ON SCHEMA mrsoft_lcdTO transferreadonly;
-- 设置
默认的模式查找顺序
SET search_path TO mrsoft_lcd;
ALTER database "transfer_lcd" SET search_path TO mrsoft_lcd;
--
显示现有的模式查找顺序,便于问题排查。
SHOW search_path;
-- 建表之后 授权给只读
用户(需要建好表之
后执行才生效)
GRANT SELECT ON ALL tables in SCHEMA mrsoft_lcd to transferreadonly;
GRANT ALL ON ALL tables in SCHEMA mrsoft_lcd to lcd;
二、切换流程
(1)停 ---- 停应用,
关闭相关的程序
(2)备 ---- 执行 pg_dump pg_restore 进行数据迁移
(3)启 ----
修改相关程序的数据源,启动程序
(4)查 ---- 数据源切换后,对系统进行全面检查
三、技术要点
(1)权限分配的步骤:tablespace --> db --> connection --> schema --> table
(2) Postgre
sql有模式(schema)的概念,
默认模式是public,新建模式 mrsoft_lcd,必须
修改默认的查找顺序,不然会出现 relation "tableName" does not exist 的
错误。使用 SHOW search_path;
显示现有的模式查找顺序。
(3)在本次迁库过程中,遇到最大的问题是 Postgre
sql 新建模式权限的问题,其他的权限参考之前的脚本也能
快速处理。
查看权限:
使用 \z(tablename) 或 \dp(tablename)查看权限,也可使用navicat、pgadmin等可视化工具查看。
Access privileges 说明:
权限的含义如下:
r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
D -- T
runcATE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)
* -- grant option for preceding privilege
/yyyy -- role that granted this privilege
(4)基本操作指令:
\c
dbname -- 切换
数据库(use
dbname)
\l -- 列举
数据库(show databases)
\dt -- 列举表(show tables)
\d tablename -- (查看表结构)
\q --
退出
\z或 \dp -- 查看权限
(5) 对需要备份的库没有远程整库备份的权限,只能做单表备份,并且 pg_restore 的时候必须模式
名称一致才可还原。


#!/bin/bash
bak_table_ary=(table1 table2)
# dump
function start_dump_lcd(){
code=lcd
bak_path="/DATA/DataBackup/${code}"
echo "创建目录${bak_path}"
mkdir -p ${bak_path}
for table in ${bak_table_ary[@]};
do
echo "开始备份${code} ${table}"
/usr/pgsql-10/bin/pg_dump "host=192.168.100.116 port=5444 dbname=dbname user=user password=password" -a -t ${table} -F c -Z 5 -f ${bak_path}/${table}.backup
done
}
start_dump_lcd
pg_dump 脚本
@H_
404_16@


#!/bin/bash
bak_table_ary=(table1 table2)
airport_code_ary=(lcd wly)
# restore
function start_restore(){
code=${1}
bak_path="/DATA/DataBackup/${code}"
for table in ${bak_table_ary[@]};
do
echo "开始还原${code} ${table}"
/usr/pgsql-10/bin/pg_restore -U ${code} -h 127.0.0.1 -p 5448 -d transfer_${code} -F c /DATA/DataBackup/${code}/${table}.backup
done
}
#restore airport_code_ary
for code in ${airport_code_ary[@]};
do
start_restore ${code}
done
pg_restore 脚本
@H_
404_16@
@H_
404_16@
@H_
404_16@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。