gbase8a如何在繁忙的情况下修复gbase.table_distribution

发布于:2023-01-04 ⋅ 阅读:(267) ⋅ 点赞:(0)

gbase.table_distribution在gbase 8a中是最重要的系统表之一。有时碰到硬件异常什么的,文件可能会受损。在自动同步不能修复时,如何修复它呢。特别是一个繁忙的系统中,不断有DDL的情况下。修复分三步,但这三步如果手工进行,就会有间隙,在间隙中有DDL,就会失败。 所以可以写个python脚本来一次完成。之所以要用python,是因为这个同步异常产生的事件,要通过gbase提供的python接口来完成。
第一步是从其它正常的管理节点scp文件过来,第二步是清除dml事件,第三步是sql刷新表。

脚本如下(将IP,密码改成你的即可。ssh中的gbase指运行数据库的操作系统用户)。
本例中10.17.46.21是需要修复的管理节点。 10.17.46.25 是其它正常的管理节点。

#!/usr/bin/env python


 
import sys
from optparse import OptionParser
import paramiko
import gcware


def main():
    try:
        ssh = paramiko.SSHClient()
        key = paramiko.AutoAddPolicy()
        ssh.set_missing_host_key_policy(key)
        ssh.connect('10.17.46.21',22,'gbase','gbase',timeout=5)
        print('\033[0m')
        
        print '     1 +++++++++++++++ scp file from other cluser node +++++++++++++++'.lstrip()
        stdin, stdout, stderr = ssh.exec_command("source ~/.bashrc;scp -p gbase@10.17.46.25:/opt/gcluster/userdata/gcluster/gbase/table_distribution*  gbase@10.17.46.21:/opt/gcluster/userdata/gcluster/gbase/")    
        for ika in stdout.readlines():
            print(ika) 
        for iee in stderr.readlines():
            print('\033[1;31;40m')
            print(iee)  
        print ('\n')    
        
        print ('    2 +++++++++++++++ gcluserd cleardmlstoragefevent:  +++++++++++++++')
        print gcware.cleardmlstoragefevent("gbase.table_distribution")   
        print ('\n') 

        print '     3+++++++++++++++ gccli flush table  +++++++++++++++'.lstrip()
        stdin, stdout, stderr = ssh.exec_command("source ~/.bashrc;gccli -uroot -p123456 -h10.17.46.21 -vvv -e'flush table gbase.table_distribution;'")   
        for ik in stdout.readlines():
            print(ik) 
        for iee in stderr.readlines():
            print('\033[1;31;40m')
            print(iee)      
        ssh.close()
                
        print('\033[0m') 
        

                 
    except:
        sys.exit(1)

if __name__=='__main__':
    main()