17.3. 分发设计变更内容

在您的开发服务器上面里的dev5数据库设计、更改、与测试应用系统后,接下来的工作就是分发变更内容到下列两类数据库:

分发过程必须遵循下列步骤进行:

  1. 锁住app5数据库。

    锁住期间,不允许任何客户承租Section 17.2.4应用系统编号5』。

    开发者应执行这道指令,以锁住app5数据库:

    wget -q --auth-no-challenge --http-user=john@example.biz --http-password=MyYyPPassSwwordD -O - https://www.terarows.com/pdbs/lock/5
    				

    curl -u john@example.biz:MyYyPPassSwwordD https://www.terarows.com/pdbs/lock/5
    				

    上述指令,如果执行成功,则回传Y;如果执行失败,则回传N

  2. app5数据库以及每一个承租应用系统编号5』的客户使用的数据库上面执行您的分发脚本。

    开发者应执行这道指令,以下载你的app5以及您全部客户的服务器IP地址以及数据库名:

    wget -q --auth-no-challenge --http-user=john@example.biz --http-password=MyYyPPassSwwordD -O /tmp/hosts.txt https://www.terarows.com/pdbs/hosts/5
    				

    curl -u john@example.biz:MyYyPPassSwwordD -o /tmp/hosts.txt https://www.terarows.com/pdbs/hosts/5
    				

    上述指令,如果执行成功,/tmp/hosts.txt有资料;如果执行失败,则没有/tmp/hosts.txt这个文档或该文档无内容。

    假设/tmp/hosts.txt含有下面三个目标数据库:

    192.168.1.200	app5
    192.168.2.15	udb456
    10.0.2.2	udb789
    				
  3. 解锁app5

    解锁之后,重新开放客户承租Section 17.2.4应用系统编号5』。

    开发者应执行这道指令,以解锁app5数据库:

    wget -q --auth-no-challenge --http-user=john@example.biz --http-password=MyYyPPassSwwordD -O - https://www.terarows.com/pdbs/unlock/5
    				

    curl -u john@example.biz:MyYyPPassSwwordD https://www.terarows.com/pdbs/unlock/5
    				

    上述指令,如果执行成功,则回传Y;如果执行失败,则回传N

上述john@example.biz是您的电子邮件地址,MyYyPPassSwwordD是您在的登录密码。请以真实资料替换!

下面是完整的分发脚本例子。

在您当地机器里准备/tmp/patch-db.sql文档。它存放全部PostgreSQL指令,将在每一个目标数据库上面执行:

BEGIN;

CREATE TABLE x_y_ (
	c1 TEXT PRIMARY KEY,
	c2 INTEGER;
);

COPY x_y_ FROM stdin;
AA	1
BB	2
\.

CREATE FUNCTION my_func(param TEXT) AS $$
BEGIN
	INSERT INTO x_y_ VALUES (param,3);
END $$ LANGUAGE PLPGSQL VOLATILE;

SELECT my_func('CC');

DROP TABLE x_y_;

DROP FUNCTION my_func();

COMMIT;
		

在您当地机器里准备/tmp/patch-db.sh这个文档。它存放下面内容:

#!/bin/bash

APPLICATION=5
SQL_FILE=/tmp/patch-db.sql
HOST_DB_FILE=/tmp/hosts.txt
USER_PASSWORD=john@example.biz:MyYyPPassSwwordD
URL_PREFIX=https://www.terarows.com/pdbs

#Lock template database.
RESULT=`curl -s -u $USER_PASSWORD $URL_PREFIX/lock/$APPLICATION`
if [ "$RESULT" != "Y" ]; then
	echo "Failed to lock template database app${APPLICATION}."
	exit 1
fi

function unlock_template_database {
	RESULT=`curl -s -u $USER_PASSWORD $URL_PREFIX/unlock/$APPLICATION`
	if [ "$RESULT" != "Y" ]; then
		echo "Failed to unlock template database. Customers can't subscribe application# $APPLICATION now!"
	fi
}

#Download list of target hosts and databases.
rm -f $HOST_DB_FILE
curl -s -u $USER_PASSWORD -o $HOST_DB_FILE $URL_PREFIX/hosts/$APPLICATION
if [ ! -f "$HOST_DB_FILE" ]; then
	unlock_template_database
	echo "Failed to download list of target hosts and databases."
	exit 1
fi

#Apply this patch on all target databases in all target servers.
while read -a fields; do
	echo "===${fields[0]}	${fields[1]}==="
	cat $SQL_FILE |
		ssh dba@${fields[0]} "psql -U postgres --set AUTOCOMMIT=off --set ON_ERROR_STOP=on ${fields[1]}"
	if [ "$?" -ne 0 ]; then
		unlock_template_database
		exit 1
	fi
done < $HOST_DB_FILE

unlock_template_database
exit 0
		
		

在您当地机器里下chmod u+x /tmp/patch-db.sh这个指令,把该文档变成可执行档。然后下/tmp/patch-db.sh这个指令,执行这个模拟版的「分发设计变更内容」工作。