之前介绍通过拷贝pg数据库文件迁移的方式详情看文章:postgresql数据库迁移(拷贝数据库文件方式迁移),这种方式存在弊端是必须将旧库和新库停掉,这会对用户影响比较大。
最近由于原有的服务器性能无法满足现有环境的使用要求,需将业务上的pg库迁移到性能更好的服务器上。这里讨论的是迁移数据,pg库安装暂时忽略,会在其他文章上介绍。另外,为了避免数据库使用受到影响,这里用定时备份的数据迁移到新的数据库上去。
文章主要分两部分:
(1)、备份pg数据,定时备份脚本;
(2)、将备份数据迁移到新的数据库上。
#一、定时备份数据
#备份脚本
#!/bin/bash
#date:2020-06-27
#author:believer
#discription: Backup database data
#设置环境变量
#
source /etc/profile > /dev/null 2>&1
#su - postgres
BACKUP_TIME=`date "+%Y%m%d%H%M%S"`
BACKUP_DIR='/data/PGbackup/backupdata'
BACKUP_LOG='/data/PGbackup/log'
if [ ! -d ${BACKUP_DIR} ];
then
mkdir -p ${BACKUP_DIR}
chmod -R 777 ${BACKUP_DIR}
fi
if [ ! -d ${BACKUP_LOG} ];
then
mkdir -p ${BACKUP_LOG}
chmod -R 777 ${BACKUP_LOG}
fi
for database in cis cas buse test pg_test
do
pg_dump -h 127.0.0.1 -U postgres $database > ${BACKUP_DIR}/${database}_${BACKUP_TIME}.sql
if [ $? -eq '0' ];
then
echo "backup $database successful !" >> ${BACKUP_LOG}/${database}_${BACKUP_TIME}_dump.log
else
echo "backup $database fail !!!" >> ${BACKUP_LOG}/${database}_${BACKUP_TIME}_dump.log
fi
done
#exit
#cd ${BACKUP_DIR}/;tar -zcvf pgdump_${BACKUP_TIME}.tar.gz *.sqli
#定时清理旧的备份文件
cd ${BACKUP_DIR}/
find ${BACKUP_DIR}/ -type f -mtime +7 -exec rm -f {} \;
#定时清理日志
cd ${BACKUP_LOG}/
find ${BACKUP_LOG}/ -type f -mtime +5 -exec rm -f {} \;
#定时备份数据
[root@docker-test101 ~]# crontab -e
no crontab for root - using an empty one
00 00 * * * sh /home/pgbackup/script/pg_back.sh
[root@docker-test101 ~]# systemctl restart crond
#二、迁移或是恢复数据:
[postgres@test100 ~]$
[postgres@test100 ~]$
[postgres@test100 ~]$
[postgres@test100 ~]$ psql
psql (10.6)
Type "help" for help.
#创建库,纯净的库(一般业务场景都有建库的脚本,可以直接指向建库脚本,这边是手动建库)
postgres@[local]:5432=#create database pg_test owner postgres;
postgres@[local]:5432=#\l
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
#pg_test | postgres | UTF8 | zh_CN.utf8 | zh_CN.utf8 |
# postgres | postgres | UTF8 | zh_CN.utf8 | zh_CN.utf8 |
template0 | postgres | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/postgres + | | | | | postgres=CTc/postgres
(5 rows)
[postgres@test100 ~]$ psql -U postgres -d pg_test -f pg_test_20200615195538.sql
...
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TRIGGER
CREATE TRIGGER
CREATE TRIGGER
GRANT
附录PG库的创建用户授权的知识点:
# 创建test用户
postgres@[local]:5432=#create user test with password ‘test@123’;
CREATE ROLE
# 将数据库权限赋予root用户
postgres@[local]:5432=#GRANT ALL PRIVILEGES ON DATABASE test to test;
GRANT
# 将用户修改成超级用户
postgres@[local]:5432=# ALTER ROLE test WITH SUPERUSER;