暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB2.0.1到2.0.2升级方案

IT那活儿 2025-06-11
124

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


方案一

替换GAUSSHOME为2.0.1,然后dump备份数据,重装一个2.0.2,再把数据导入。

1.1 备份软件目录、数据目录(注意磁盘空间使用)

查询磁盘空间大小:

df -h

备份软件目录:

cp /database/panweidb/app database/panweidb/app_bak

备份数据目录:

cp /database/panweidb/data database/panweidb/data_bak

1.2 上传安装包到/soft目录,并创建panweidb_201目录

mkdir panweidb_201

解压安装包:

tar zxvf PanWeiDB-2.0.0_Build0\(9fbca90\)-bclinux_euler21.10-x86_64-no_mot.tar.gz -C panweidb_201
cd panweidb_201
tar xvf PanWeiDB-2.0.0_Build0\(9fbca90\)-bclinux-64bit.tar.bz2 -C database/panweidb/app

1.3 登入omm用户启动数据库

su - omm
pw_ctl start

1.4 检查数据库是否为2.0.1

psql -r查看commit

1.5 使用dump备份数据

nohup gs_dumpall -p 5432 -U pwadmin -f /database/all_databases_backup.sql > database/backup.log 2>&1 &

1.6 重新安装2.0.2数据库,并创建好相应的数据库用户及赋权

1.7 数据导入

nohup gsql -d postgres -p 5432 -U panweidb -f /database/all_databases_backup.sql > database/restore.log 2>&1 &

方案二

替换GAUSSHOME为2.0.1,用patch升级为2.0.2。

2.1 备份软件目录、数据目录(注意磁盘空间使用)

查询磁盘空间大小:

df -h

备份软件目录:

cp /database/panweidb/app database/panweidb/app_bak

备份数据目录:

cp /database/panweidb/data database/panweidb/data_bak

2.2 上传安装包到/soft目录,并创建panweidb_201目录

mkdir panweidb_201

解压安装包:

tar zxvf PanWeiDB-2.0.0_Build0\(9fbca90\)-bclinux_euler21.10-x86_64-no_mot.tar.gz -C panweidb_201
cd panweidb_201
tar xvf PanWeiDB-2.0.0_Build0\(9fbca90\)-bclinux-64bit.tar.bz2 -C database/panweidb/app

2.3 登入omm用户启动数据库

su - omm
pw_ctl start

2.4 检查数据库是否为2.0.1

psql -r查看commit

2.5 使用dump备份数据

nohup gs_dumpall -p 5432 -U pwadmin -f /database/all_databases_backup.sql > database/backup.log 2>&1 &

2.6 上传2.0.2patch包到/soft目录,并创建panweidb_202B01目录

mkdir panweidb_202B01

2.7 解压安装包

tar zxvf PanWeiDB_V2.0-S2.0.2_B01-patch-bclinux_euler21.10-x86_64.tar.gz -C panweidb_202B01/
cd panweidb_202B01/patch/
tar zxvf PanWeiDB_V2.0-S2.0.2_B01-patch-bclinux_euler21.10-x86_64.tar.gz

2.8 执行升级前置步骤使用root用户

cd /soft/panweidb_202B01/patch/PanWeiDB_V2.0-S2.0.2_B01-patch-bclinux_euler21.10-x86_64/PWPatch/script
./pwpatch --setparam -u omm -g dbgrp -a /database/panweidb/app -d database/panweidb/data -p 5432 -t home/omm/omTmp/tmp
./pwpatch -C
./pwpatch -P

2.9 使用omm用户进行升级

cd /soft/panweidb_202B01/patch/PanWeiDB_V2.0-S2.0.2_B01-patch-bclinux_euler21.10-x86_64/PWPatch/script

2.10 检查数据库是否为2.0.2

psql -r查看commit

2.11 检查 \d+ pg_catalog.pg_subscription


数据校验

3.1 创建存储表

CREATE TABLE schema_comparison (
    database_name TEXT,
    schema_name TEXT,
    table_name TEXT,
    structure_hash TEXT, -- 用于存储系统表的哈希值
    row_count BIGINT,    -- 用于存储数据表的行数
    environment TEXT,    -- 'pre_upgrade' 或 'post_upgrade'
    PRIMARY KEY (database_name, schema_name, table_name, environment)
);

3.2 生成哈希值和行数

#!/bin/bash

DB_USER="pwadmin"
DB_PASSWORD='pwadmin'
DB_PORT=6432
ENVIRONMENT=$1# 'pre_upgrade' 或 'post_upgrade'
OUTPUT_LOG="/home/omm_mysql/schema_comparison_$ENVIRONMENT.log"

# 获取所有数据库列表(排除模板数据库)
DATABASES=$(psql -U $DB_USER -W $DB_PASSWORD -p $DB_PORT -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;")

# 遍历所有数据库
for DB in$DATABASESdo
    echo"Processing database: $DB" >> $OUTPUT_LOG
    
    # 在当前数据库中创建存储表(如果尚未创建)
    psql -U $DB_USER -W $DB_PASSWORD -p $DB_PORT -d $DB -c "
    CREATE TABLE IF NOT EXISTS schema_comparison (
        database_name TEXT,
        schema_name TEXT,
        table_name TEXT,
        structure_hash TEXT,
        row_count BIGINT,
        environment TEXT,
        PRIMARY KEY (database_name, schema_name, table_name, environment)
    );
    "
 >> $OUTPUT_LOG 2>&1

    # 执行表结构和行数比较
    psql -U $DB_USER -W $DB_PASSWORD -p $DB_PORT -d $DB -c "
    DO \$\$
    DECLARE
        r RECORD;
        tbl_name TEXT;
        tbl_schema TEXT;
        tbl_structure_hash TEXT;
        tbl_row_count BIGINT;
    BEGIN
        FOR r IN
            SELECT schemaname, tablename
            FROM pg_tables
            WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
        LOOP
            tbl_name := r.tablename;
            tbl_schema := r.schemaname;

            -- 计算表结构的哈希值
            EXECUTE format('SELECT md5(string_agg(column_name || data_type, '','')) FROM information_schema.columns WHERE table_schema = %L AND table_name = %L', tbl_schema, tbl_name) INTO tbl_structure_hash;

            -- 计算表的行数
            EXECUTE format('SELECT count(*) FROM %I.%I', tbl_schema, tbl_name) INTO tbl_row_count;

            -- 插入计算结果
            EXECUTE format('INSERT INTO schema_comparison (database_name, schema_name, table_name, structure_hash, row_count, environment)
                            VALUES (%L, %L, %L, %L, %L, %L)
                            ON CONFLICT (database_name, schema_name, table_name, environment)
                            DO UPDATE SET structure_hash = EXCLUDED.structure_hash, row_count = EXCLUDED.row_count',
                            '$DB', tbl_schema, tbl_name, tbl_structure_hash, tbl_row_count, '$ENVIRONMENT');
        END LOOP;
    END \$\$
    "
 >> $OUTPUT_LOG 2>&1
done

3.3 比较哈希值和行数

#!/bin/bash

DB_USER="pwadmin"
DB_PASSWORD='pwadmin'
DB_PORT=6432
OUTPUT_LOG="/home/omm_mysql/schema_comparison_diff.log"

# 获取所有数据库列表(排除模板数据库)
DATABASES=$(psql -U $DB_USER -W $DB_PASSWORD -p $DB_PORT -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;")

# 初始化输出日志文件
echo"" > $OUTPUT_LOG

# 遍历所有数据库进行比较
for DB in$DATABASESdo
    echo"Comparing schema in database: $DB" >> $OUTPUT_LOG

    psql -U $DB_USER -W $DB_PASSWORD -p $DB_PORT -d $DB -c "
    SELECT
        COALESCE(pre.database_name, post.database_name) AS database_name,
        COALESCE(pre.schema_name, post.schema_name) AS schema_name,
        COALESCE(pre.table_name, post.table_name) AS table_name,
        pre.structure_hash AS pre_upgrade_structure_hash,
        post.structure_hash AS post_upgrade_structure_hash,
        pre.row_count AS pre_upgrade_row_count,
        post.row_count AS post_upgrade_row_count,
        CASE
            WHEN pre.table_name IS NULL THEN 'Missing in Pre-Upgrade'
            WHEN post.table_name IS NULL THEN 'Missing in Post-Upgrade'
            WHEN pre.structure_hash IS DISTINCT FROM post.structure_hash THEN 'Structure Mismatch'
            WHEN pre.row_count IS DISTINCT FROM post.row_count THEN 'Row Count Mismatch'
            ELSE 'Match'
        END AS status
    FROM
        (SELECT * FROM schema_comparison WHERE environment = 'pre_upgrade') pre
    FULL OUTER JOIN
        (SELECT * FROM schema_comparison WHERE environment = 'post_upgrade') post
    ON
        pre.database_name = post.database_name
        AND pre.schema_name = post.schema_name
        AND pre.table_name = post.table_name
    ORDER BY
        database_name, schema_name, table_name;
    "
 >> $OUTPUT_LOG 2>&1
done

3.4 生成哈希值和行数脚本升级前执行一次,升级后执行一次

./generate_hash_and_count.sh pre_upgrade
./generate_hash_and_count.sh post_upgrade

3.5 执行比较脚本

./compare_hash_and_count.sh


END


本文作者:陈 聪(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论