7月 01

mongodb 单机的备份与恢复

【2011-06-30 张子萌】
备份与恢复是数据保存的重要技术。本次只是学习记录单机的操作。
mongodb的备份和恢复提供了两种方式。备份为bson格式和和备份为json和csv格式。

a)导出bson格式
主要用于单机小数据量的备份、快照等。存储被bson格式,bson(Binary JSON ),
是轻量级的二进制数据格式。

备份命令mongodump
参数
–help 帮助信息
-v [ –verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-h [ –host ] arg 指定要备份的服务器ip
–port arg 指定要备份的服务器端口,需要与服务器ip一起使用,格式为ip:port
–ipv6 开启ipv6的支持,默认是关闭的
-u [ –username ] arg 用户名
-p [ –password ] arg 密码
–dbpath arg 指定连接数据库后访问数据的位置,但是不能是当前使用的目录
–directoryperdb 为每一个库建立一个目录。
-d [ –db ] arg 指定要备份的库名
-c [ –collection ] arg 指定要导出的collection
-o [ –out ] arg (=dump) 输出的目录,默认目录为执行命令的路径下创建dump目录
-q [ –query ] arg 可以json查询,有选择性的导出数据
–oplog 使用oplog
–repair 尝试修复损坏的数据库

恢复命令mongorestore
参数
–help 帮助信息
-v [ –verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-h [ –host ] arg 指定要导入的服务器ip
–port arg 指定要导入的服务器端口,需要与服务器ip一起使用,格式为ip:port
–ipv6 开启ipv6的支持,默认是关闭的
-u [ –username ] arg 用户名
-p [ –password ] arg 密码
–dbpath arg 指定连接数据库后访问数据的位置,但是不能是当前使用的目录
–directoryperdb 为每一个库建立一个目录。
-d [ –db ] arg 指定要备份的库名
-c [ –collection ] arg 指定要导出的collection
–objcheck 插入前检测对象的合法性
–filter arg 插入前的过滤器
–drop 在导入前删除要导入的集合
–oplogReplay 恢复日志时间点

测试,首先查看要测试的数据库(mytest)文件大写
> show dbs
admin (empty)
mytest 1.953125GB
开始备份,将本地mytest库导出到tmp目录下
# mongodump -d mytest -o /tmp
导出结束耗时如下
real 0m5.412s
user 0m0.007s
sys 0m2.039s
导出后数据存为bson格式体积为577M。mytest库里存的是MP3所以导出数据库压缩的不多。

开始做恢复测试,首先删除mytest库,在导入
# mongorestore –directoryperdb -d mytest /tmp/mytest
导入结束耗时如下:
real 0m52.587s
user 0m0.514s
sys 0m1.732s

总结:导入时间大约是导出时间的10倍。

b)导出json格式
虽然导出速度快,
但是导出为json,csv可能对某些数据类型不兼容,并且不保证数据可以完整导入。
所以只简单记录一下,就不是实验了。
导出命令mongoexport
参数
-q [ –query ] arg query filter, as a JSON string
–csv export to csv instead of json
–jsonArray output to a json array rather than one object per
line

恢复命令mongoimport
参数
–ignoreBlanks 在csv,tsv文件中忽略空域
–type arg 指定导入文件的类型,默认为json,也可以是csv,tsv
–drop 导入前先删除原collection
–headerline 仅导入CSV,TSV文件的第一行作为头文件
–upsert 插入或更新已存在的对象
–upsertFields arg comma-separated fields for the query part of the
upsert. You should make sure this is indexed
–stopOnError 当导入出现错误时停止
–jsonArray 导入json array,目前每个array的限制是4M

6月 27

python测试连接mongodb 简单读写

下载pymongo模块,测试机python为2.6.6
[2011-6-27 张子萌]
# wget http://pypi.python.org/packages/source/p/pymongo/pymongo-1.11.tar.gz
解压安装
# tar zxvf pymongo-1.11.tar.gz
# cd pymongo-1.11
# python setup.py install

安装比较简单,下面写一个脚本测试一下是否成功。返回的也是dict。

#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor = db.mytest.find()
for i in cursor:
print i

有结果就ok了。

a)测试1存取二进制

插入MP3试试看。首先上传一个test.mp3,然后把MP3转为二进制,最后入库。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
import bson
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
get_mp3=open(‘test.mp3′,’rb’) #以二进制方法读取MP3
bin=bson.Binary(get_mp3.read()) #转换对象
db.mytest.save({“file_name”:”test_mp3″,”mp3″:bin}) #保存入库
get_mp3.close()

如库查询看到以下结果,MP3已经入库成功。
> db.mytest.find({},{file_name:1})
{ “_id” : ObjectId(“4e0a70d0b4a1024472000000”), “file_name” : “test_mp3” }

现在在把MP3读出来看看是否可以用。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor=db.mytest.find({“file_name” : “test_mp3”},{“mp3”:1})
file=open(‘123.mp3′,’wb’)
print >>file,cursor[0][“mp3”] #因为测试库中就有一首所以不用循环了
file.close

取出MP3试听是否成功。

b)测试2存取字符型。文本文件保存也可以用二进制,但是字符型更好,便于索引和
查找。
首先建立一个test.txt测试文本,内容如下:
first
second
three
four

用以下脚本入库
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
get_txt=open(‘test.txt’,’r’)
for line in get_txt: #也可以不用循环,将文件插入到一个值里
db.mytest.insert({“file_name”:”test_txt”,”content”:line})
get_txt.close()

入库完毕登录mongodb检查,结果如下:
> db.mytest.find({“file_name”:”test_txt”},{})
{ “_id” : ObjectId(“4e0a762bb4a1024508000000”), “content” : “firstn”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000001”), “content” : “secondn”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000002”), “content” : “threen”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000003”), “content” : “fourn”, “file_name” : “test_txt” }

现在在把文本读出来看看是否可以用。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor=db.mytest.find({“file_name” : “test_txt”},{“content”:1})
file=open(‘123.txt’,’a’)
for i in cursor:
print >>file,i[“content”]
file.close

查看文本已经输出,因为是追加,并且在库里保存了回车符“n”,所以输出的文件都会隔一行写一行。

http://api.mongodb.org/python/1.11/installation.html
http://pypi.python.org/pypi/pymongo/