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()