分享

mongo不同库之间多表导入导出

 苏鱼鱼的IT运维 2019-05-13

需求:

源库地址: 192.168.10.10

目标地址: 192.168.10.20

需要将源库的多张表复制到目标库

python脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
from pymongo import MongoReplicaSetClient
from pymongo import MongoClient
import logging
from remotessh import sshmongo

# 日志存储目录
logging.basicConfig(filename='D:/info.txt', level=logging.INFO)

# 获取当前时间
NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
# 数据源
DataSource = MongoClient('mongodb://192.168.10.10:27017')
dbSource = DataSource.company
# 密码认证,没有可不写
dbSource.authenticate('test', 'test')
# 目标库
DataTarget = MongoClient('mongodb://192.168.10.20:27017')
dbTarget = DataTarget.company

# 查看所有库名

# print c.list_database_names()

# 需要导入的三张表

ImportTables = ['cm', 'ccc', 'hehe']
# 查看所有表
# for i in dbTarget.collection_names():
# print i, '总条数:', dbTarget[i].find().count()

def MainFunc():
for i in ImportTables:
if i in dbSource.collection_names():
SourceNum = dbSource[i].find().count()
if i in dbTarget.collection_names():
TargetNum = dbTarget[i].find().count()
print i, '源库总条数:', SourceNum, i, '目标总条数:', TargetNum
# 删除目标表中的数据
dbTarget[i].drop()
# 插入新的数据
res = sshmongo.RemoteSer(i)
if res == 0001:
logging.info(NowTime +
"-------->" + "无法通过ssh连接远程服务器")
elif res == 0002:
logging.info(NowTime +
"-------->" + "连接mongo失败或者插入数据错误!")
else:
pass
else:
logging.info(
NowTime +
"-------->" + "%s 表在源库共有 %d 条数据,目标中没有,直接导入数据" %
(i
, SourceNum))
res = sshmongo.RemoteSer(i)
if res == 0001:
logging.info(NowTime +
"-------->" + "无法通过ssh连接远程服务器")
elif res == 0002:
logging.info(NowTime +
"-------->" + "连接mongo失败或者插入数据错误!")
else:
pass
else:
# print "%s 表在源库中不存在,无法导入目标库" % i
logging.info(NowTime + "-------->" + "%s 表在源库中不存在,无法导入目标库" % i)
DataSource.close()
DataTarget.close()

MainFunc()

这个脚本调用了另外一个远程连接服务器执行shell命令的python脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import paramiko
import os
import re

hostname = '192.168.10.20'
username = 'root'
password = '11111111111'
port = int(20001)


def RemoteSer(tables):
# noinspection PyBroadException
try:
ssh = paramiko.SSHClient()
key = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(key)
ssh.connect(hostname, port, username, password, timeout=5)
# 执行多条shell命令
# stdin, stdout, stderr = ssh.exec_command('cd /data/; ls -l; touch test.txt',get_pty=True)
# stdin, stdout, stderr = ssh.exec_command('rm -rf %s/*' % backdir, get_pty=True)
stdin, stdout, stderr = ssh.exec_command('mongoexport -h 192.168.10.10 -u test -ptest -d company --port 27017 -c'
' %s | mongoimport -h 192.168.10.20 -d company -c %s --port 27017'
% (tables, tables), get_pty=True)

for i in stdout.readlines():
ErrorStr = re.compile(r'error', re.IGNORECASE).findall(i)
if ErrorStr:
pass
return 0002

ssh.close()

except Exception:
# print "连接服务器失败!"
return 0001

把你需要的表写入到

ImportTables
并且修改成你的地址就OK了!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多