技术开发 频道

DBA应用技巧:利用MySQL技能学习MongoDB

  【IT168 专稿】随着互联网的发展和新技术的不断涌现,传统意义上只管理一组同类数据库的情形已很少出现,管理不同类型的数据库是大多数数据库管理员的一种新型工作方式。在企业的实际应用中,会有各种不同的方案和产品来存放数据,比如我们经常遇到的表格、图像、视频等形式的数据,这些方案和产品包括 Oracle、Microsoft SQL Server、DB2、Informix、Sybase或者诸如MySQL和PostgreSQL之类的开源数据库。大多数企业要求DBA具有管理多种异构数据库的技能,所有对各种数据源具有丰富知识的人才是企业不可或缺的。

  MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

  本文将帮助您根据现有的MySQL知识学习来MongoDB,将带领您快速了解MongoDB。

DBA应用技巧:利用MySQL技能学习MongoDB

  一、安装

  首先来看看MySQL和MongoDB的安装步骤,两者的安装步骤都非常简单。

  1、MySQL的Windows安装

  MySQL服务器安装包可以从以下网站上下载:http://dev.mysql.com/downloads/,安装方式取决于下载的安装程序,主要分为两种安装方法:

  (1)、MSI Installer方式安装

  在官网上下载msi安装程序,双击mysql-5.*.*-win32.msi,出现安装界面后一步一步的按提示安装即可:

DBA应用技巧:利用MySQL技能学习MongoDB

  这种安装方式简单易懂,符合新手的软件安装习惯。接下来我们看一下免安装方式的安装方法。

  (2)、ZIP方式安装

  如果是高级用户我见意用这种方式安装,因为用户可定制的选项可以更多一些,更加便于管理和维护。

  Step1: 在官网上下载zip安装程序,

  Step2: 解压该文件到自己选定的目录比如"D:\MySQL\"

  Step3: 在"D:\MySQL\"目录下,新建一个my.ini的文件向其中添加如下数据:

    [mysqld]
    basedir=D:\MySQL
    datadir=D:\MySQL\data

  这种方式对于一个专业的DBA来说,使用起来更加灵活自如。

  2、MongoDB的Windows安装

  MongoDB在Windows平台上的安装方式只有zip方式,且安装及配置都比MySQL要简单的多,具体如下:

  Step1: 在官网上下载ZIP安装包,注意是64位还是32位版本的,请选择正确的版本。

  Step2: 在"D:"盘解压下载到的安装包,并重命名为"mongodb"

  Step3: 建立”d:\data\db”目录用于存放数据文件

  Step4: 执行”d:\mongodb\bin\mongod.exe”文件来启动MongoDB服务器

  Step5: 打开游览器输入URL “http://localhost:27017/”,如果出现下面的页面则说明已正常启动:

You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number

  3、MySQL的Linux安装

  MySQL在Linux平台下的常见的安装方式共3种, 下面将分别介绍。

  (1)、RPM方式安装

  Step1: 从官网上下载mysql服务器端和客户端rpm安装文件

  Step2: 执行rpm安装

    rpm –ivh MySQL-server-community-5.1.45-1.rhel5.i386.rpm
    rpm –ivh MySQL-client-community-5.1.45-1.rhel5.i386.rpm

  这样就完成了mysql的rpm方式的安装。

  (2)、二进制方式安装

  Step1: 新建MySQL用户及用户组

    groupadd mysql
    useradd –g mysql mysql

  Step2: 解压下载的mysql压缩包

    tar zxvf mysql-5.1.45.tar.gz

  Step3: 移动mysql-5.1.45到/usr/local/mysql

  Step4: 初始化安装mysql数据库

    cd /usr/local/mysql
    scripts/mysql_install_db --user=mysql

  这样就完成了mysql的二进制方式安装。

  (3)、源码方式安装

  源码方式安装为高级用户提了一个可以定制安装的途径,用户可以配置更多的选项,更加灵活的使用MySQL

  Step1: 新建MySQL用户及用户组

    groupadd mysql
    useradd –g mysql mysql

  Step2: 解压下载的mysql压缩包

    tar zxvf mysql-5.1.45.tar.gz
    cd mysql-5.1.45

  Step3: 用configure工具来编译源代码,这里我们可以使用很多的参数,具体可以用configure --help来查看,这里我们将MySQL安装到/usr/local/MySQL下

    ./configuer --prefix=/usr/local/MySQL
    make
    make install

  Step4: 选择一个配置文件,并复制到/etc/下重命名为my.cnf

    cp support-files/my-medium.cnf /etc/my.cnf

  Step5: 初始化安装mysql数据库

    cd /usr/local/mysql
    bin/mysql_install_db --user=mysql

  Step6: 修改目录权限

    chown -R root .
    chown -R MySQL var
    chgrp -R MySQL .

  Step7: 开启MySQL服务

    ./bin/mysqld_safe --user=mysql

  这样就完成了mysql的源码方式安装。

  4、MongoDB的Linux安装

  MongoDB的Linux平台下安装步骤与Windows一样,只不过是操作系统不一样而已。

  Step1: 在官网上下载tgz安装包,注意是64位还是32位版本的,请选择正确的版本。

  Step2: 在"/Apps/"盘解压下载到的安装包,并重命名为"mongodb"

  Step3: 建立”/data/db”目录用于存放数据文件

  Step4: 执行” /Apps/mongodb/bin/mongod”文件来启动MongoDB服务器

  Step5: 打开游览器输入URL “http://192.168.1.103:28017/”,如果出现让你输入用户名和口令的页面则说明已正常启动。

  综上所述,对于MongoDB这一NoSQL领域的新战士来说,它的安装方式比起MySQL更加简单和方便。

  二、数据存储结构

  1、MySQL的数据存储结构

  MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,MySQL数据库文件包括MySQL所建数据库文件和MySQL所用存储引擎创建的数据库文件。

  MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm、.MYD、.MYI
  MySQL如果使用InnoDB存储引擎,数据库文件类型就包括.frm、ibdata1、.ibd

  (1)、数据库文件:

  .frm文件:存储数据表的框架结构,MySQL数据库文件名与表名相同,每个表对应一个同名frm文件,与操作系统和存储引擎无关,即不管MySQL运行在何种操作系统上,使用何种存储引擎,都有这个文件。除了必有的.frm文件,根据MySQL所使用的存储引擎的不同(MySQL常用的两个存储引擎是MyISAM和InnoDB),存储引擎会创建各自不同的数据库文件。

  (2)、MyISAM数据库表文件:

    .MYD文件:即MY Data,表数据文件
    .MYI文件:即MY Index,索引文件
    .log文件:日志文件

  (3)、InnoDB采用表空间:

  ibdata1、ibdata2:系统表空间MySQL数据库文件,存储InnoDB系统信息和用户数据库表数据和索引,被所有表共用;

  .ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),用于存放用户数据库表数据和索引;

  日志文件:ib_logfile1、ib_logfile2。

  2、MongoDB的数据存储结构

  MongoDB对国内用户来说比较新, 它就像是一个黑盒子,但是如果对于它内部的数据存储了解多一些的话,那么将会很快的理解和驾驭MongoDB,让它发挥它更大的作用。

  MongoDB的默认数据目录是/data/db,它负责存储所有的MongoDB的数据文件。在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所以如果系统中有一个叫做foo的数据库,那么构成foo这个数据库的文件就会由foo.ns,foo.0,foo.1,foo.2 等等组成,具体如下:

[root@localhost db]# ll /data/db/
总计 196844
-rw------- 1 root root 16777216 04-15 16:33 admin.0
-rw------- 1 root root 33554432 04-15 16:33 admin.1
-rw------- 1 root root 16777216 04-15 16:33 admin.ns
-rw------- 1 root root 16777216 04-21 17:30 foo.0
-rw------- 1 root root 33554432 04-21 17:30 foo.1
-rw------- 1 root root 67108864 04-21 17:30 foo.2
-rw------- 1 root root 16777216 04-21 17:30 foo.ns
-rwxr-xr-x 1 root root        6 04-21 17:16 mongod.lock
-rw------- 1 root root 16777216 04-15 16:30 test.0
-rw------- 1 root root 33554432 04-15 16:30 test.1
-rw------- 1 root root 16777216 04-15 16:30 test.ns
drwxr-xr-x 2 root root     4096 04-21 17:30 _tmp
[root@localhost db]#

  MongoDB内部有预分配表空间的机制,每个预分配的文件都用0进行填充,由于有了这个机制, MongoDB始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。

  由于表中数据量的增加,数据文件每新分配一次,它的大小都会是上一个数据文件大小的2倍,每个数据文件最大2G。这样的机制有利于防止较小的数据库浪费过多的磁盘空间,同时又能保证较大的数据库有相应的预留空间使用。

  数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在*.ns文件中。

  在下图中,foo这个数据库包含3个文件用于存储表和索引数据,foo.2文件属于预分配的空文件。foo.0和foo.1这两个数据文件被分为了相应的盘区对应不同的名字空间。

DBA应用技巧:利用MySQL技能学习MongoDB

  上图显示了命名空间和盘区的关系。每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的。与数据文件的增长相同,每一个命名空间对应的盘区大小的也是随着分配的次数不断增长的。这样做的目的是为了平衡命名空间浪费的空间与保持某一个命名空间中数据的连续性。上图中还有一个需要注意的命名空间:$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新的盘区的时候,都会先查看$freelist是否有大小合适的盘区可以使用。

  三、命令行工具及SQL语法

  MySQL是个广泛应用的关系型数据库产品,其语法规则遵守SQL99标准,MongoDB是新型的NoSQL产品,是文档型存储结构,其语法与传统的数据库产品略有不同,但殊途同归,都可以完成数据库开发和管理工作。下面的表格比较全面的对比了二者之间的区别,相信大家看了下表后应该对MySQL和MongoDB在整体上会有比较全面的理解,好,下面就让大家对这两个数据库进行比较学习。

DBA应用技巧:利用MySQL技能学习MongoDB
▲点击查看原图

  四、授权和权限

  数据库的安全性是每一个DBA重点关注的部分,在数据库建立之后,数据的安全就显得尤为重要。

  对于一个数据库管理员来说,安全性就意味着他必须保证那些具有特殊数据访问权限的用户能够登录到数据库服务器,并且能够访问数据以及对数据库对象实施各种权限范围内的操作;同时,DBA还要防止所有的非授权用户的非法操作。

  1、MySQL授权和权限

  MySQL中有两种级别的权限:管理和用户。所有权限都可分别使用 GRANT 和 REVOKE 语句授予和收回。可以授予用户create、select、update、delete、insert、execute、index 等权限,也可授予alter、drop和shutdown等系统权限。根用户root在默认情况下具有所有权限。

  2、MongoDB授权和权限

  官方文档开启MongoDB 服务时不添加任何参数时,可以对数据库任意操作,而且可以远程访问数据库,所以推荐只是在开发是才这样不设置任何参数。如果启动的时候指定--auth参数,可以从阻止根层面上的访问和连接

  (1)、只允许某ip访问

    mongod --bind_ip 127.0.0.1

  (2)、指定服务端口

    mongod --bind_ip 127.0.0.1 --port27888

  (3)、添加用户认证

    mongod --bind_ip 127.0.0.1 --port27888 –auth

  (4)、添加用户

  在刚安装完毕的时候MongoDB都默认有一个admin数据库,而admin.system.users中将会保存比在其它数据库中设置的用户权限更大的用户信息。

  当admin.system.users中一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作,直到在admin.system.users中添加了一个用户。

  下面分别创建两个用户, 在foo中创建用户名为user1密码为pwd1的用户,如下:

[root@localhost bin]# ./mongo --port 27888
MongoDB shell version: 1.8.1
connecting to: test
> use foo
switched to db foo
> db.addUser("user1","pwd1")
{
        "user" : "user1",
        "readOnly" : false,
        "pwd" : "35263c100eea1512cf3c3ed83789d5e4"
}

   在admin中创建用户名为root密码为pwd2的用户,如下:

> use admin
switched to db admin
> db.addUser("root", "pwd2")
{
        "_id" : ObjectId("4f8a87bce495a88dad4613ad"),
        "user" : "root",
        "readOnly" : false,
        "pwd" : "20919e9a557a9687c8016e314f07df42"
}
> db.auth("root", "pwd2")
1
>

   如果认证成功会显示1, 用以下命令可以查看特定的数据库的用户信息:

> use admin
switched to db admin
> db.system.users.find();
{ "_id" : ObjectId("4f8a87bce495a88dad4613ad"), "user" : "root", "readOnly" : false, "pwd" : "20919e9a557a9687c8016e314f07df42" }
> use foo
switched to db foo
> db.system.users.find();
{ "_id" : ObjectId("4f92966d77aeb2b2e730c1bb"), "user" : "user1", "readOnly" : false, "pwd" : "35263c100eea1512cf3c3ed83789d5e4" }
>

   下面我们试验一下用户的权限设置是否正确:

[root@localhost bin]# ./mongo --port 27888
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27888/test
> use foo
switched to db foo
>  db.system.users.find();
error: {
        "$err" : "unauthorized db:foo lock type:-1 client:127.0.0.1",
        "code" : 10057
}
> use admin
switched to db admin
>  db.system.users.find();
error: {
        "$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",
        "code" : 10057
}
>

  通知以上实验结果,说明登录时不指定用户名和口令时会报错,也就是说安全性的部署生效了。下面我再看一下另一个场景:

[root@localhost bin]# ./mongo --port 27888 -uroot -ppwd2  
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27888/test
Sat Apr 21 19:23:15 uncaught exception: login failed
exception: login failed

  奇怪了,我们明明指定了用户名而且口令也没有错呀,这时我们看一下系统日志上是否有一些有价值的信息:

auth: couldn't find user root, test.system.users

  哦,原来是这样,说明连接mongodb时,如果不指定库名,那么会自动连接到test库,但刚才我们新建的用户,都不是在test库上建立的,所以我们需要显示指定需要连接的库名:

[root@localhost bin]# ./mongo --port 27888 admin -uroot -ppwd2
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27888/admin
> show collections;
system.indexes
system.users
> use foo
switched to db foo
> show collections
system.indexes
system.users
t1
>

  可以看到root这个用户有所有库的操作权限, 那么user1这个用户有什么权限呢?我们一试便知:

[root@localhost bin]# ./mongo --port 27888 foo -uuser1 -ppwd1
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:27888/foo
> show collections;
system.indexes
system.users
t1
> use test
switched to db test
> show collections
Sat Apr 21 19:28:25 uncaught exception: error: {
        "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
        "code" : 10057
}
>

  通过结果我们看到, 由于user1是在foo库里建立的用户,所以它不具有操作其它数据库,甚至是test库的权限。

  五、导入和导出

  1、MySQL导入和导出

  (1)、mysqlimport

  此工具位于mysql/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件student.txt中把数据导入到数据库class中的表 student中:

    mysqlimport class.student student.txt

  (2)、load data infile

  这个命令与mysqlimport非常相似,但这个方法可以在MySQL命令行中使用。 如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令:

    Load data local infile "d:\student.txt" into table student;

  上面的local参数表示文件是本地的文件,服务器是您所登陆的服务器。这样就省去了使用ftp来上传文件到服务器,mysql替你完成了。

  (3)、mysqldump

  mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但mysqldump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式并且将其转换成DDL语法,取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。因此,如果您像装载整个数据库mydb的内容到一个文件中,可以使用下面的命令:

    bin/mysqldump –p mydb > mydb.txt

  2、MongoDB导入和导出

  (1)、mongoexport导出工具

  MongoDB提供了mongoexport工具,可以把一个collection导出成json格式或csv格式的文件。可以指定导出哪些数据项,也可以根据给定的条件导出数据。工具帮助信息如下:

[root@localhost bin]# ./mongoexport --help
options:
  --help                  produce help message
  -v [ --verbose ]        be more verbose (include multiple times for more
                          verbosity e.g. -vvvvv)
  -h [ --host ] arg       mongo host to connect to (
<set name>/s1,s2 for sets)
  --port arg              server port. Can also use --host hostname:port
  --ipv6                  enable IPv6 support (disabled by default)
  -u [ --username ] arg   username
  -p [ --password ] arg   password
  --dbpath arg            directly access mongod database files in the given
                          path, instead of connecting to a mongod  server -
                          needs to lock the data directory, so cannot be used
                          if a mongod is currently accessing the same path
  --directoryperdb        if dbpath specified, each db is in a separate
                          directory
  -d [ --db ] arg         database to use
  -c [ --collection ] arg collection to use (some commands)
  -f [ --fields ] arg     comma separated list of field names e.g. -f name,age
  --fieldFile arg         file with fields names - 1 per line
  -q [ --query ] arg      query filter, as a JSON string
  --csv                   export to csv instead of json
  -o [ --out ] arg        output file; if not specified, stdout is used
  --jsonArray             output to a json array rather than one object per
                          line
[root@localhost bin]#

  下面我们将以一个实际的例子说明,此工具的用法:

  将foo库中的表t1导出成json格式:

[root@localhost bin]# ./mongoexport -d foo -c t1 -o /data/t1.json
connected to: 127.0.0.1
exported 1 records
[root@localhost bin]#

   导出成功后我们看一下/data/t1.json文件的样式,是否是我们所希望的:

[root@localhost data]# more t1.json
{ "_id" : { "$oid" : "4f927e2385b7a6814a0540a0" }, "age" : 2 }
[root@localhost data]#

   通过以上说明导出成功,但有一个问题,要是异构数据库的迁移怎么办呢?例如我们要将MongoDB的数据导入到MySQL该怎么办呢?MongoDB提供了一种csv的导出格式,就可以解决异构数据库迁移的问题了. 下面将foo库的t2表的age和name列导出, 具体如下:

[root@localhost bin]# ./mongoexport -d foo -c t2 --csv -f age,name -o /data/t2.csv
connected to: 127.0.0.1
exported 1 records
[root@localhost bin]#

   查看/data/t2.csv的导出结果:

[root@localhost data]# more t2.csv
age,name
1,"wwl"
[root@localhost data]#

  可以看出MongoDB为我们提供了一个强在的数据导出工具。

  (2)、mongoimport导入工具

  MongoDB提供了mongoimport工具,可以把一个特定格式文件中的内容导入到某张collection中。工具帮助信息如下:

[root@localhost bin]# ./mongoimport --help
options:
  --help                  produce help message
  -v [ --verbose ]        be more verbose (include multiple times for more
                          verbosity e.g. -vvvvv)
  -h [ --host ] arg       mongo host to connect to (
<set name>/s1,s2 for sets)
  --port arg              server port. Can also use --host hostname:port
  --ipv6                  enable IPv6 support (disabled by default)
  -u [ --username ] arg   username
  -p [ --password ] arg   password
  --dbpath arg            directly access mongod database files in the given
                          path, instead of connecting to a mongod  server -
                          needs to lock the data directory, so cannot be used
                          if a mongod is currently accessing the same path
  --directoryperdb        if dbpath specified, each db is in a separate
                          directory
  -d [ --db ] arg         database to use
  -c [ --collection ] arg collection to use (some commands)
  -f [ --fields ] arg     comma separated list of field names e.g. -f name,age
  --fieldFile arg         file with fields names - 1 per line
  --ignoreBlanks          if given, empty fields in csv and tsv will be ignored
  --type arg              type of file to import.  default: json (json,csv,tsv)
  --file arg              file to import from; if not specified stdin is used
  --drop                  drop collection first
  --headerline            CSV,TSV only - use first line as headers
  --upsert                insert or update objects that already exist
  --upsertFields arg      comma-separated fields for the query part of the
                          upsert. You should make sure this is indexed
  --stopOnError           stop importing at first error rather than continuing
  --jsonArray             load a json array, not one item per line. Currently
                          limited to 4MB.

  下面我们将以一人实际的例子说明,此工具的用法:

  先看一下foo库中的t1表数据:

> db.t1.find();
{ "_id" : ObjectId("4f937a56450beadc560feaa9"), "age" : 5 }
>

   t1其中有一条age=5的记录, 我们再看一下json文件中的数据是什么样子的:

[root@localhost data]# more t1.json
{ "_id" : { "$oid" : "4f937a56450beadc560feaa7" }, "age" : 8 }
[root@localhost data]#

   可以看到t1.json文件中有一条age=8的数据,下面我们将用mongoimport工具将json文件中的记录导入到t1表中:

[root@localhost bin]# ./mongoimport -d foo -c t1 /data/t1.json
connected to: 127.0.0.1
imported 1 objects

   工具返回信息说明向表中插入了一条记录. 我们进库里实际验证一下:

[root@localhost bin]# ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use foo
switched to db foo
> db.t1.find();
{ "_id" : ObjectId("4f937a56450beadc560feaa9"), "age" : 5 }
{ "_id" : ObjectId("4f937a56450beadc560feaa7"), "age" : 8 }
>

   结果跟我们期待的是一样的,数据成功插入到表中。

  六、备份和恢复

  在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。

  1、MySQL备份和恢复

  MySQL备份方式大体上分为以下3种:

    ● 直接拷贝数据库文件
    ● 使用mysqlhotcopy备份数据库
    ● 使用mysqldump备份数据库

  (1)、直接拷贝数据库文件

  最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在靠背文件前,执行以下 SQL 语句:

    FLUSH TABLES WITH READ LOCK;

  也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。

  但对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 表损坏时,就可以依靠这些日志文件来恢复。

  (2)、使用mysqlhotcopy备份数据库

  mysqlhotcopy 是perl程序。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。对于备份数据库或单个表来说它是最快的途径,但它只能运行在本地服务器上,且mysqlhotcopy 只能备份 MyISAM表,对于Innodb表则无招可施了。

  (3)、使用mysqldump备份数据库

  mysqldump 是SQL级别的备份,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最主流的备份方法。

  2、MongoDB备份和恢复

  MongoDB提供了两个命令来备份(mongodump )和恢复(mongorestore )数据库。

  (1)、mongodump备份工具

  我们先看一下此工具的帮助信息:

[root@localhost bin]# ./mongodump --help
options:
  --help                   produce help message
  -v [ --verbose ]         be more verbose (include multiple times for more
                           verbosity e.g. -vvvvv)
  -h [ --host ] arg        mongo host to connect to (
<set name>/s1,s2 for
                           sets)
  --port arg               server port. Can also use --host hostname:port
  --ipv6                   enable IPv6 support (disabled by default)
  -u [ --username ] arg    username
  -p [ --password ] arg    password
  --dbpath arg             directly access mongod database files in the given
                           path, instead of connecting to a mongod  server -
                           needs to lock the data directory, so cannot be used
                           if a mongod is currently accessing the same path
  --directoryperdb         if dbpath specified, each db is in a separate
                           directory
  -d [ --db ] arg          database to use
  -c [ --collection ] arg  collection to use (some commands)
  -o [ --out ] arg (=dump) output directory or "-" for stdout
  -q [ --query ] arg       json query
  --oplog                  Use oplog for point-in-time snapshotting
  --repair                 try to recover a crashed database
[root@localhost bin]#

  例如我们的系统中有一个叫做”foo”库,下面我们将演示如何将这个库备份出来:

[root@localhost bin]# ./mongodump -d foo -o /data/dump
connected to: 127.0.0.1
DATABASE: foo    to     /data/dump/foo
        foo.system.indexes to /data/dump/foo/system.indexes.bson
                 3 objects
        foo.system.users to /data/dump/foo/system.users.bson
                 1 objects
        foo.t2 to /data/dump/foo/t2.bson
                 1 objects
        foo.t1 to /data/dump/foo/t1.bson
                 2 objects
[root@localhost bin]#

  通过工具返回信息,我们可以看到foo中的数据已经被备份成bson格式的文件了, 接下来我们到备份的目录下去验证一下:

[root@localhost dump]# ll /data/dump/foo/
总计 16
-rw-r--r-- 1 root root 193 04-22 11:55 system.indexes.bson
-rw-r--r-- 1 root root  91 04-22 11:55 system.users.bson
-rw-r--r-- 1 root root  66 04-22 11:55 t1.bson
-rw-r--r-- 1 root root  49 04-22 11:55 t2.bson
[root@localhost dump]#

  结果证明foo库中的表已经被成功备份出来,接下来我们将演示如何将备份恢复回去。

  (2)、mongorestore恢复工具

  我们先看一下此工具的帮助信息:

[root@localhost bin]# ./mongorestore --help
usage: ./mongorestore [options] [directory or filename to restore from]
options:
  --help                  produce help message
  -v [ --verbose ]        be more verbose (include multiple times for more
                          verbosity e.g. -vvvvv)
  -h [ --host ] arg       mongo host to connect to (
<set name>/s1,s2 for sets)
  --port arg              server port. Can also use --host hostname:port
  --ipv6                  enable IPv6 support (disabled by default)
  -u [ --username ] arg   username
  -p [ --password ] arg   password
  --dbpath arg            directly access mongod database files in the given
                          path, instead of connecting to a mongod  server -
                          needs to lock the data directory, so cannot be used
                          if a mongod is currently accessing the same path
  --directoryperdb        if dbpath specified, each db is in a separate
                          directory
  -d [ --db ] arg         database to use
  -c [ --collection ] arg collection to use (some commands)
  --objcheck              validate object before inserting
  --filter arg            filter to apply before inserting
  --drop                  drop each collection before import
  --oplogReplay           replay oplog for point-in-time restore
[root@localhost bin]#

  例如我们先将”foo”库删除了:

[root@localhost bin]# ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use foo
switched to db foo
> db.dropDatabase();
{ "dropped" : "foo", "ok" : 1 }
> show dbs
admin   0.0625GB
local   (empty)
test    0.0625GB
>

  然后下面我们将演示如何恢复这个库:

[root@localhost bin]# ./mongorestore --directoryperdb /data/dump
connected to: 127.0.0.1
Sun Apr 22 12:01:27 /data/dump/foo/t1.bson
Sun Apr 22 12:01:27      going into namespace [foo.t1]
Sun Apr 22 12:01:27      2 objects found
Sun Apr 22 12:01:27 /data/dump/foo/t2.bson
Sun Apr 22 12:01:27      going into namespace [foo.t2]
Sun Apr 22 12:01:27      1 objects found
Sun Apr 22 12:01:27 /data/dump/foo/system.users.bson
Sun Apr 22 12:01:27      going into namespace [foo.system.users]
Sun Apr 22 12:01:27      1 objects found
Sun Apr 22 12:01:27 /data/dump/foo/system.indexes.bson
Sun Apr 22 12:01:27      going into namespace [foo.system.indexes]
Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.system.users", key: { _id: 1 }, v: 0 }
Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.t2", key: { _id: 1 }, v: 0 }
Sun Apr 22 12:01:27 { name: "_id_", ns: "foo.t1", key: { _id: 1 }, v: 0 }
Sun Apr 22 12:01:27      3 objects found
[root@localhost bin]#

  通过工具返回信息,我们可以看到foo中的数据已经被恢复回来了, 接下来我们到库里去验证一下:

[root@localhost bin]# ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use foo
switched to db foo
> show collections;
system.indexes
system.users
t1
t2
>

  结果证明foo库表已经被成功恢复回来了。

0
相关文章