GBase 8a
运维管理
文章
GBASE 8A存储过程代码分离
发表于2026-01-14 11:55:4221次浏览0个评论
GBASE 8A存储过程代码分离
1.使用gcdump备份元数据信息,备份代码如下:
| #!/bin/bash . $HOME/.gbase_profile dir=/gbase/mpp_aomp/metedata dir2=/gbase/mpp_aomp/metedata/log pwdbase=xxxx ##该变量为当天日期的前一天 cur_date1=`date -d "1 day ago" "+%Y%m%d"` ##该变量为当天日期 cur_date2=`date "+%Y%m%d"` ##当前小时和分钟 cur_hour=`date "+%H:%M"` gccli -ugbase -p${pwdbase} -Nse 'show databases' > ~/shsnc/mpp_aomp/Metadata_backup/databasesname.txt echo "==========[`date "+%Y-%m-%d %H:%M:%S"`] ddl_backup Info==========" ##读取databasesename文件中的数据,并且排除gbase,gclusterdb,gctmpdb,information_schema,performance_schema cat ~/shsnc/mpp_aomp/Metadata_backup/databasesname.txt | grep -v "gbase\|gclusterdb\|gctmpdb\|information_schema\|performance_schema" | while read dbn ; do gcdump --routines=true -f -t -B ${dbn} > ${dir}/${dbn}.proc.${cur_date2} 2>> ${dir2}/${dbn}.proc.err.${cur_date2} gcdump -f -n -B -R ${dbn} > ${dir}/${dbn}.sql.${cur_date2} 2>> ${dir2}/${dbn}.sql.err.${cur_date2} done ##每天五点钟执行 if [ "${cur_hour}" == "05:00" ]; then ##自动删除60天前的文件 find ${dir} -type f -name "*.sql.${cur_date2}" -mtime +60 -print | xargs rm -f cd ${dir} tar -zcvf ddlbak.${cur_date2}.tar *.sql.${cur_date1} fi |
2.拆分备份的存储过程代码(由于gcdump备份的存储过程都存在一个sql文件中,需要单独拆分)
使用gcdump命令导出存储过程(如下简单导出)
gcdump -ugbase -pGBase2O11O531 --routines=true -f -t -B OMRS > OMRS.sql
2.使用db2_getproc.py 分离存储过程代码(先处理导出后的sql文件,才可使用python脚本分离存储过程)
sed -i "s/\` \*\//\` /g;s/;;/\/\//g" PROCEDURE.sql
python脚本如下:
| #!/usr/bin/python #-*- coding:utf-8 -*- import re import sys import os def split_stored_procedures(input_file, output_dir): # 确保输出目录存在 if not os.path.exists(output_dir): os.makedirs(output_dir) with open(input_file, 'r') as f: content = f.read() # 匹配存储过程 pattern = re.compile(r'(DROP PROCEDURE IF EXISTS.*?DELIMITER\s*;\s*)', re.DOTALL | re.IGNORECASE) procedures = pattern.findall(content) for proc in procedures: # 提取存储过程名称 name_match = re.search(r'DROP PROCEDURE IF EXISTS `([^`]+)`', proc, re.IGNORECASE) if not name_match: continue proc_name = name_match.group(1) print "Found procedure: %s" % proc_name # 标准化结束标记 normalized_proc = re.sub(r'DELIMITER\s*;+\s*$', 'DELIMITER ;', proc.strip(), flags=re.IGNORECASE) # 创建输出文件路径 output_path = os.path.join(output_dir, "%s.sql" % proc_name) # 写入文件 with open(output_path, 'w') as f: f.write(normalized_proc + '\n') if __name__ == '__main__': if len(sys.argv) != 3: print "Usage: python split_procedures.py " print "Example: python split_procedures.py procedures.sql ./output" sys.exit(1) input_file = sys.argv[1] output_dir = sys.argv[2] split_stored_procedures(input_file, output_dir) |
评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25051
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526