热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用MySQL知识来学习MongoDB

随着互联网的发展和新技术的不断涌现,传统意义上只管理一组同类数据库的情形已很少出现,管理不同类型的数据库是大多数数据库管理员的一种新型工作方式。在企业的实际应用中,会有各种不同的方案和产品来存放数据,比如我们经常遇到的表格、图像、视频等形
  随着互联网的发展和新技术的不断涌现,传统意义上只管理一组同类数据库的情形已很少出现,管理不同类型的数据库是大多数数据库管理员的一种新型工作方式。在企业的实际应用中,会有各种不同的方案和产品来存放数据,比如我们经常遇到的表格、图像、视频等形式的数据,这些方案和产品包括 Oracle、Microsoft SQL Server、DB2、Informix、Sybase或者诸如MySQL和PostgreSQL之类的开源数据库。大多数企业要求DBA具有管理多种异构数据库的技能,所有对各种数据源具有丰富知识的人才是企业不可或缺的。
  MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  本文将帮助您根据现有的MySQL知识学习来MongoDB,将带领您快速了解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: couldnt 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-rr 1 root root 193 04-22 11:55 system.indexes.bson
  -rw-rr 1 root root 91 04-22 11:55 system.users.bson
  -rw-rr 1 root root 66 04-22 11:55 t1.bson
  -rw-rr 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库表已经被成功恢复回来了。   

推荐阅读
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文探讨了在MySQL数据库中处理大规模数据删除的最佳实践,包括分批删除、利用索引、管理事务以及选择合适的删除命令等策略,旨在提升删除效率并确保系统稳定。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 8个IDC大数据基础定义解析丨IDC
    本文针对IDC数据行业相关名词术语进行解析,分为4组相关概念,希望大家读完 ... [详细]
author-avatar
小白石
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有