MySQL在Windows上的启动及停止

这一节会讨论在Windows上运行MySQL Server前,你应该检查的相应先决条件。这里同时会说到如何手工通过命令行模式来运行服务,或者作为一个Windows服务来自动启动运行。

 

3.3.1 WindowsMySQL服务启动的先决条件

由于MySQL的安装目录中包含了几个非常重要的子目录,因此我们应该在MySQL安装时,就明确了解MySQL安装在哪里。如果你在是通过MySQL Installer进行的安装,那么MySQL默认的安装目录为C:\Program Files\MySQL\MySQL Server 5.x。如果你使用noinstall归档压缩包进行安装,那么安装的路径就是你当时解压的位置。

 

在安装目录下,你会找到一个bin子目录,其包含了MySQL服务和客户端程序。而data子目录中则用于存放server对应的数据库。

 

在Windows上的MySQL安装,data目录会预先进行设定以备使用。例如,它会包含一个mysql目录以用于数据库mysql,这个数据库包含了授权表。data目录中也会包含一个test数据库目录以用于测试目的。在服务被安装后,你需要设置账户初始密码,而这些账号会被列在授权表中。

在MySQL的Windows分支版本相应bin目录中你可能会看到以下服务程序:

  • mysqld作为Linux操作系统的标准服务(最新的Windows分支版本中也会使用mysqld),它包含了MyISAM和InnoDB存储引擎。
  • mysqld-ntmysqld一样,不过它包含了对基于NT系统如Windows NT, 2000, XP和2003的命令管道支持。
  • mysqld-maxmysql-max-nt对应的mysql和mysql-nt一样,但包括了一些非max服务所有的其他一些存储引擎。
  • mysqld-debug包含了对调试的支持。通常情况下你不需要选择此类MySQL server来用于生产环境,因为它会需要更多的运行时资源,并占用更多内存。

 

通常分支版本中仅包含mysqld或mysqld-nt服务程序。

 

当你在Windows上启动MySQL,MySQL会认为你的默认安装路径为C:\mysql,当然实际上你可以将它装在任何位置,但如果你真的这么做了,你就必须在server启动时告知它对应的位置在哪里。一种方法是你建立一个配置文件,并在文件中定义好你的路径位置。在使用MySQL Installer进行安装时,过程中会启用配置精灵,通过以下步骤引导你进行基本或完整组件安装的设置并建立配置文件:

  • 配置精灵会首先使用安装目录C:\Program Files\MySQL\MySQL Server 5.x并在其中建立一个名为ini的配置文件。配置文件包含了一个[mysqld]组,组中包括有一个basedir参数用于设置安装的目录:

    请注意:配置文件中设置的Windows路径中使用斜杠”/”,而不是反斜杠”\”

  • 配置精灵会在安装server时将其注册为一个Window服务。其在进行注册时,其命令中会包含一个--defaults-file参数项来指定ini的文件位置:

    (其中–install参数后的MySQL为服务名,你可根据情况自行设定,下图中注册的服务名为MySQL56)

这样当服务启动后,MySQL Server会知道在哪里可以找配置文件,并从配置文件中获取安装目录的位置。

 

如果你使用配置精灵来安装MySQL,但又希望MySQL服务使用其他服务程序(非mysqld,如mysqld-max)来启动运行,那么你需要移除原有Windows服务,并使用其他服务名来对应进行服务注册。

 

3.3.2 Windows上手动运行MySQL Server

在Windows命令行窗口中手工使用命令来运行MySQL,你需要通过命令行转至MySQL安装目录的bin子目录下,并调用服务命令:

** 你可以将bin目录路径整个添加到Windows系统环境变量path中,这样就可以直接调用命令而不必频繁进行跳转目录操作。

默认情况下,Windows会将报错信息写入data子目录下的host_name.err日志文件中(host_name为MySQL服务主机名)。如果MySQL Server未能正常启动,你需要检查报错日志文件已分析报错原因。当然,你也可以通过使用以下命令在MySQL启动时在Windows命令行窗口中显示诊断输出进行查看分析:

其他一些server参数也可以在命令中或在配置文件中进行设置。

 

当你在命令行窗口中调用MySQL服务程序后,命令行将不会再显示任何提示直至服务退出。关闭窗口会导致服务被中止,因此,如果你希望在命令窗口中运行其他MySQL程序,你需要在server运行时打开一个新的命令窗口,在新窗口中执行命令操作。

如果需要关闭MySQL服务,可以在命令行中使用mysqladmin命令实现:

你也可以通过Windows任务管理器来关闭MySQL,不过你应该尽量避免这么操作;因为任务管理器会强行中止MySQL server的运行,这将导致server没有机会进行干净地关闭。结果可能导致数据讹误并需要进行表修复。

 

3.3.3 Windows服务的方式运行MySQL

之前我们讲述了如何手工运行MySQL server。其他方法,则可以在安装时将MySQL server注册为一个Window服务,并设置为【自动】。这样,MySQL server就会在Windows启动或关闭时进行自启动及自动关闭。

 

如果你在安装MySQL时使用了MySQL Installer,你可能已经使用了配置精灵建立起了MySQL的Windows服务并启动了服务。否则,你将需要自己来进行服务注册,为了完成注册,你需要转到MySQL安装路径的bin子目录下。之后在调用mysqld命令时使用 –install参数:

** 这里命令使用时,对应的bin目录路径已经存入了path环境变量中了。

 

你也可以将所需的启动参数写入配置文件中,并在注册服务中告知server在启动时读取此配置文件。如使用C:\server-opts.ini文件作为服务配置文件:

通过--defaults-file设置,MySQL服务在启动时读取对应文件中的[mysqld]配置组,由于设置了--defaults-file因此,它会忽略默认位置的配置文件中的设置。

命令中 –install设置并不会真正启动server。它仅仅是告诉Windows将其作为一个服务来进行处理,并当Windows启动或关闭时,同时自动启动mysqld或关闭它。你也可以通过以下命令来手动启动或关闭服务,通过此操作来开启MySQL或关闭它:

这里的MySQL为注册的Windows服务名。

可以使用一个图形界面来控制此MySQL服务,你可以使用Windows服务管理器。

列出所有服务,找到对应MySQL的服务,进行启动或关闭操作。

 

你也可以使用mysqladmin shutdown命令来进行手工关闭。

 

如果服务不能正常启动,检查data子目录中的报错日志或直接使用mysqld启动,同时带上–console参数,这样报错信息就会直接出现在命令行窗口中了。

 

如果需要移除MySQL服务,请先确保MySQL已经被关闭,然后使用以下命令:

以上命令默认MySQL服务名为MySQL。如果Windows对应服务名不同,则你可以使用以下命令显示提供服务名:

如果你不是使用服务名MySQL来进行安装,且在服务注册时也未指定--defaults-file参数项,那么MySQL服务将会查找默认位置的标准配置文件, 除了读取其中[mysqld]组的设置之外,还会读取[service_name]组中的参数设置。

 

除了以上这些方法外来启动关闭MySQL之外,你也可以使用MySQL Workbench等集成工具来实现此操作。如果你在使用MySQL Installer安装MySQL的时候同时安装有MySQL Notifier,你也可以使用这个小工具来进行MySQL的启动和关闭控制:

 

MySQL 5.7 CREATE USER命令增强

在MySQL5.7之前,在使用CREATE USER命令时有以下多个限制:

  • 无法设置授权插件并密码
  • 无法禁用一个用户
  • 无法设置用户资源限制
  • 无法设置非默认密码的过期策略
  • 无法使用SSL/x509
所有这些限制实际上都可以通过其它方法来得到实现,但通常你需要涉及到使用其它语句,如GRANT命令。
从MySQL 5.7.6开始,这些操作可以通过这个新增强的CREATE USER语法来进行实现。

 

密码及授权插件设置

 

从安全角度来说,这是最重要的部分,在使用建立用户账户的同时能够使用非默认的授权插件(如sha256_password)和非空密码设置:
这里,我们可以使用CREATE USER ... IDENTIFIED BY子句来设置密码,在建立用户时,不能强制建立的账户不使用空密码是一个非常大的安全问题。

 

禁用账号

 

MySQL团队注意到之前有许多大量关于避免终端用户可直接访问某些账户的需求。甚至在MySQL 5.6版本中实现了mysql_no_login授权插件来支持此类使用。现在有更好的方法了 – 只需要定义账号为锁定状态即可:

 

其他新建账号语句项

 

还有一些对CREAT USER命令的其他方便的增强,如建立一个新账号并定义一个非标准密码过期策略:
同时,在建立一个新账号时,你不再需要其他很多命令来实现SSL安全通信:
你也能在同一句建立账号的语句中限制资源使用:
通过使用这些语法,用户可以大大简化用户建立过程及脚本命令行数量。同时我们也需要感谢Satish和所有带来这些功能增强的人!
如果你对相关的新语法感兴趣,可查阅MySQL最新文档。
MySQL 5.7关于CREATE USER命令文档链接:

 

MySQL在Unix上的启动及停止

MySQL可以在许多Unix和Unix-like系统中运行,这些系统包括BSD Unix, System V Unix以及Linux的各种分支版本等。这节会阐述如何使得MySQL在这些平台上运行的通用步骤。主题包括了在运行服务前进行先决条件检查以及MySQL server的启动和停止等。

 

在Unix上,我们推荐使用一个明确的用户和组(而不是使用root)来进行MySQL Server的运行和管理,这样MySQL可以在相应权限下运行。在文中,我们假设所使用的用户和用户组都为mysql。

 

3.4.1 UnixMySQL Server启动的先决条件

尝试在Unix上运行MySQL之前,你应该先确认MySQL相关的组件都已经安装好了,且已经有一个MySQL登陆账号可用于管理和运行此服务。如果必要的话你也需要初始化对应数据目录。

 

在Unix上,预编译好的MySQL分发版以RPM文件或压缩tar文件(或其他类型)存在。RPM被用于Linux系统的安装。tar文件则可在用于更多平台。这些文件也是大家通常下载最多的文件类型。

 

由于分发版本中会分成多个不同RPM文件,因此MySQL RPM安装通常要求一个或多个RPM文件。其中最重要的文件为server程序安装文件和对client程序安装文件,所以做为最小安装的情况,你一般会将这两个都安装上。如果你想进行MySQL server的全组件安装,你就需要下载对应bundle组件包并解压,除了安装其中最基本的MySQL server RPM 外,将其下的其它所有RPM包都一并进行安装。

 

RPM的安装过程中会建立一个操作系统登陆用户以用于管理和运行MySQL服务,用户名和组名都为mysql。过程中也会安装所有相关文件,初始化数据目录,及安装已包含了初始MySQL账号的mysql数据库。之后安装会名为mysql的启动脚本注册到/etc/init.d目录中,并启动数据库。Server程序会被安装在/usr/sbin下,而数据目录则被建立在/var/lib/mysql中。

 

tar包发行版的安装很简单,仅通过解压即可。

例如,如果你下载的Linux发行版为mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz,你可以将其解压至/usr/local下以建立mysql-5.6.25-linux-glibc2.5-x86_64的子目录,通常你可以在/usr/local下另建立一个软链接(symbolic link)以指向此目录,名字如mysql,用以方便访问。在本节中,我们假设之后Unix上的MySQL tar包安装目录路径为/usr/local/mysql。

 

建立软链接的好处,除了目录名更短之外,当你需要升级MySQL时,你可以很容易地将此软链接指向新版本MySQL安装目录(只需要删除后重建此软链接即可)。如使用以下命令:

由于tar包版本安装并不会自动建立运行服务的操作系统账户和相应数据目录。你必须建立系统登录账号和用户组并建立初始数据目录(默认情况下数据目录为/usr/local/mysql/data),在章节中,我们这里假设建立的账号和组都为mysql。 为了建立初始数据目录,首先跳转当前目录到安装目录并运行mysql_install_db脚本。对于tar包发行版,此脚本一般被放置在对应的scripts或bin(根据版本位置有一定变化)子目录中。命令运行如:

 为了确保所有被安装的目录文件对应的所有者属性正确,你可以使用mysql账户登录并运行。或者,以root运行此脚本同时使用--user=mysql项:

mysql_install_db脚本建立数据目录并初始化mysql数据库(根据版本不同也会相应初始化test或sys等数据库)。如果你不运行此脚本,当你运行MySQL时会发现无法找到mysql数据库相应文件的报错,如:Can’t find file: ./host.frm。

请注意:在MySQL 5.7.6之后,mysql_install_db将不再使用,改用mysqld --initialize命令。

 

使用tar包发行版,你还需要安装一个启动脚本。

 

在过去版本中,不管你如何在Unix上安装MySQL(通过RPM文件或tar包文件),初始的MySQL root账号都没有密码。在服务器启动后,你需要手工建立密码。但是在5.6和5.7之后,通过RPM文件的MySQL Linux平台安装会调用mysql_secure_installation脚本以生成root随机密码,并将此随机密码存放在.mysql_secret文件中(此文件会为存放在系统环境变量HOME指定的目录下)。而当前最新5.7.6的tar包安装中,在执行数据库安装命令后会被要求执行:

其中mysqld命令的--initialize项会对root生成一个随机密码并以[warning]的提示信息显示。
更多最新版本安装细节,可访问:http://dev.mysql.com/doc/refman/5.7/en/binary-installation.html

 

3.4.2 Unix上选用一种MySQL Server启动方法

MySQL服务在Unix上可以通过以下几种方式启动

  • 你可以手工调用mysqld。除非为了调试目的,通常不会使用此方法。如果你通过这个方法调用服务,相关报错信息会默认在命令行terminal窗口中进行显示,而不是写入报错日志中。
  • 使用mysqld_safe Shell脚本来调用mysqld。脚本会建立报错日志(error log),启动mysqld并进行监控。如果mysqld异常中止,mysqld_safe会尝试重启它。
  • 使用mysql.server Shell脚本来调用mysqld_safe。它在mysqld_safe外又包了一层,此脚本用于哪些使用System V run-level目录的Linux和Solaris系统。
  • mysqld_multi是一个Perl脚本,其目的是为为了更容易地管理单个主机上的多个MySQL Servers。它能启动和停止服务,或报告server的运行状态。

 

为了让MySQL服务能在系统启动时自动运行,你需要在系统上安装适合的启动脚本:

  • 在类似BSD的Unix系统中,通常可以通过使用系统启动脚本来调用mysqld_safe,如/etc目录下的local启动脚本。

在Linux和System V Unix类等在/etc/init.d下有run-level目录的系统,可以使用mysql.server脚本。如果你在Linux上进行RPM安装,安装命令会自动将mysql.server脚本以mysql为名安装在的相应运行级下。它可以配以start或stop参数通过手工调用进行服务的启动或关闭:

 操作系统在启动和关闭过程中会自动执行以上命令。

如果服务未能正常启动,那么请查看报错日志。Unix上的默认报错日志名为host_name.err,且放于数据目录中,这里host_name为你服务器主机名。

你可以使用以下方法中的一种来手工关闭MySQL server

  • 使用mysqladmin程序的shutdown参数命令。它以一个客户端形式来连接服务并关闭本地或远程的MySQL服务。
  • 使用mysql.server脚本并配以stop参数来关闭本地服务。
  • 使用mysqld_multi脚本的stop命令来关闭其所管理的任意一个MySQL服务。实际操作中此脚本会调用mysqladmin程序。

mysqld_safe脚本并没有服务关闭能力。你可以使用mysqladmin shutdown来进行服务关闭。请注意如果你使用kill -9命令来强行中止mysqld,mysqld_safe将会探测到mysqld的异常中止并重新启动它。当然,你可以先杀掉mysqld_safe,然后再中止mysqld,但是最好还是使用mysqladmin shutdown,此命令用于完成一个正常(干净)的服务关闭。

 

在MySQL 5.6之前,除了使用mysql_multi脚本来管理多个MySQL数据库之外,我们还可以使用MySQL实例管理器 – MySQL Instance Manager (IM)来进行多个MySQL实例的启停及监控,由于功能相同,因此mysqlmananger在MySQL 5.6之后就被移除了,这里我们对此工具仅作为知识知道即可,不再做深入展开。

对于mysql_multi更多的配置细节,我们可以查看官方MySQL 5.7最新版本文档(最后由Tim Young提供了随主机启停后的自启动及关闭脚本供参考):

http://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html

MongoDB 3.0新增的压缩选项

MongoDB3.0对WiredTiger存储引擎引入了压缩功能。在本文中,我们将观察不同选项,并举例说明这个功能如何运行。由于情况因人而异,所以我们鼓励你测试自己的数据和应用程序。

 

为什么需要压缩?

每个人都知道存储很便宜对吧?

但是,有可能你添加数据的速度比存储价格下降的速度来得更快,你花费在存储上的净支出实际上正在上升。你的内部成本也可能需要包括管理等因素,因此它们的价格可能会比商品市场价格高出很多。换句话说,你仍然需要寻求新的方式以减少您对存储的需求。

 

磁盘存储的大小是一个需要考虑的因素,当然还有其他需要考虑的。磁盘I/ O延迟是由在旋转存储上寻道时间为主导。通过降低数据的大小,用更少的磁盘寻道检索一定量的数据是必要的,这样磁盘I / O吞吐量将得到改善。对于RAM而言,一些压缩格式可以不用解压在内存中的数据。在这样的情况下,更多的数据可以放在RAM中,从而提高了性能。 

MongoDB的存储性能

还有两个关于存储的重要特性,影响空间在MongoDB中的使用:BSON和动态模式。

 

MongoDB存储数据在BSON,一种类似JSON文件的二进制编码(BSON支持其他数据类型,如日期,不同的数字类型,二进制类型)。 BSON能有效编码和解码,并且易于遍历。然而,BSON不压缩数据,所以有可能它的数据表示大于同等的JSON。

 

用户喜欢MongoDB的文档数据模型的一点是其动态schema。在大多数数据库中,模式(Schema)是在一个分类或系统表中集中进行描述和维护的。列名对所有行仅保存一次。这种方法对于空间是有效的,但它需要所有数据根据模式被构造。 MongoDB中目前还没有核心分类:每个文件是自述的。新字段可以被添加到一个文档,而不会影响其他文件,并且不用在核心分类中进行字段登记。

 

更大灵活性的代价是更大的应用空间。字段名在每个文档中被定义,在允许的情况下就使用较短的字段名。但是同样要注意不要太短 – 单字母字段名称或代码会使得字段名称很难理解和阅读,其数据也变得更难使用。

 

好在传统的模式不是有效利用空间的唯一方式。对于处理重复值比如字段名称,以及在文件中存储的大量数据,压缩也是很有效的方式。

 

没有万能的压缩方法

压缩很常见:图像(JPEG,GIF),音频(MP3),视频(MPEG),以及大多数Web服务器在使用gzip发送到浏览器之前,也会压缩网页。压缩算法已经存在了几十年,也有一些奖励创新的比赛。

 

压缩库依靠CPU和RAM来压缩和解压缩数据,而且每个都在压缩率,速度和资源利用率​​方面有不同的权衡。例如,一个当今最好的压缩库在文本方面可以压缩1GB的维基百科数据到124MB,相对于gzip的323MB,但它需要大约近3000倍的时间和30000倍的内存来这样做。根据您的数据和应用程序,某个库的使用可能会对于你的需求比别人更有效。

 

MongoDB3.0引入WiredTiger,支持压缩一个新的存储引擎。 WiredTiger使用页面管理磁盘I / O。每个页面都包含很多BSON文件。页面被写入磁盘时就被默认压缩,当在磁盘中被读入高速缓存时它们就被解压。

 

压缩的基本概念之一是重复值 – 确切的值以及形式 – 可以一次以压缩的格式被存储,减少了空间的总量。较大的数据单元倾向于更有效地压缩,因为有更多重复值。通过在页面级别压缩 – 通常称为数据块压缩 – WiredTiger可以更有效地压缩数据。

 

WiredTiger支持多种压缩库。你可以决定哪个选项是最适合你的集合水平。这是一个重要的选择,你的访问模式和数据可能在集合间大不相同。例如,如果你使用GridFS的存储较大的文件,如图片和视频,MongoDB自动把大文件分成许多较小的“块”,当需要的时候再重新组合。 GridFS的实施维护两个集合:fs.files,包含大文件的元数据和其相关的块;以及fs.chunks,包含大数据分成的255KB的块。对于图像和视频,压缩可能会有益于fs.files集合,但在fs.chunks的数据可能已经被压缩,因此它对于这个集合可能需要禁用压缩。

 

MongoDB3.0中的压缩选项

在MongoDB 3.0中,WiredTiger为集合提供三个压缩选项:

  1. 无压缩
  2. Snappy(默认启用) – 很不错的压缩,有效利用资源
  3. zlib(类似gzip) – 出色的压缩,但需要占用更多资源

 

有索引的两个压缩选项:

  1. 无压缩
  2. 前缀(默认启用) – 良好的压缩,资源的有效利用

 

你也许会好奇,为什么对索引压缩选项与集合的不同。前缀压缩是相当简单的 – 值的“前缀”是将数据集中重复数据删除。这对于某些数据集特别有效,如那些低基数的(例如,国家),或那些具有重复值的,如电话号码,社会安全码和地理坐标。它对复合索引特别有效,如第一列与第二列的所有唯一值重复。前缀索引还提供了一个非常重要的优势优于Snappy或zlib – 可以直接使用压缩索引进行查询操作。

 

当从磁盘中访问被压缩的集合数据,数据在高速缓存中被解压。通过前缀压缩,索引可以在RAM中保持被压缩的形式。我们往往看到使用前缀压缩得到的非常好的带索引的压缩,这意味着在大多数情况下,你可以容纳更多的索引在内存中而不牺牲读取的性能,并且对写的影响很小。压缩率会有因您的数据的基数以及是否使用复合索引而有显著的不同。

 

请记住哪些适用于MongoDB的3.0所有压缩选项:

  1. 随机数据不能压缩
  2. 二进制数据不能压缩(它可能已经被压缩)
  3. 文本压缩效果特别好
  4. 对于文件中的字段名压缩效果特别好(尤其对短字段名来说)

 

默认情况下,对WiredTiger存储引擎存储的集合和索引启用压缩。 为了在启动时明确设置副本的压缩,需要在YAML配置文件中的进行相应设置。使用命令行选项 –wiredTigerCollectionBlockCompressor。由于WiredTiger不是在MongoDB中3.0的默认存储引擎,你还需要指定 –storageEngine选择使用WiredTiger再利用这些压缩功能。 

 

要指定压缩特定的集合,你需要使用db.createCollection() 命令中的并传入相应参数项来覆盖默认值。例如,使用zlib压缩库创建一个名为email的集合:

如何测量压缩

测量压缩的最好方法是使用和不使用启用压缩来分别装载数据,然后比较两个大小。db.stats()命令返回许多不同的存储数据,但两个与比较有关的测量点是存储大小和索引大小。值以字节为单位返回,但你可以通过传入1024*1024参数转换成MB:

这是我们在使用下面压缩方法时进行的测量方法。

 

在不同的数据集上测试压缩

让我们来看一些不同的数据集,看看一些压缩选项的执行。我们有四个数据库:

 

Enron

这是臭名昭著的Enron email corpus。它包括约50万的电子邮件。在邮件正文字段有大量的文本,一些元数据的基数很低,这意味着他们都可能会被压缩得很好。下面是一个例子(这里截断了电子邮件正文):

不同选项在Enron数据库的运行状态:

Flights

美国联邦航空管理局(FAA)提供了关于按时的航空公司服务的数据。每个航班被表示为一个文件。许多字段有低基数,所以我们觉得这个数据集会得到很好的压缩:

不同选项在Flights数据库的运行状态:

MongoDB的配置数据库

这是MongoDB存储在配置数据库进行分片集群的元数据。该手册描述了该数据库的各种集合。下面是来自块集合的一个例子,它把每个块的文件存储于集群中:

不同选项在配置数据库的运行状态:

TPC-H

TPC-H是一款经典的用于测试关系分析的数据库管理系统的标杆。该模式已被修正为使用MongoDB的文档模型。下面是订单表中的例子,只有很多行项目的第一个在此订单显示:

不同选项在TPC-H数据库的运行状态:

Twitter

这是200K的数据库。这里有一个模拟使用了Java3.0驱动的Tweets:

不同选项在Twitter数据库的运行状态:

比较压缩率

这些数据库大小不等, 这使得他们难以进行比较绝对的大小比较。我们可以通过比较每个选项所节省的存储空间来看他们的好处。要做到这一点,我们通过使用Sanppy和zlib在WiredTiger中的未压缩大小来比较每个数据库的大小。如上所述,我们增加storageSize和indexSize的值。 

另一种描述压缩的好处的方式是未压缩尺寸与压缩后的大小的比例计算。这里是Snappy和zlib在五个databases.v的执行。

如何测试自己的数据

有两种简单的方法可用于测试你在MongoDB 3.0中的数据的压缩。

 

如果你已经升级到MongoDB 3.0,你可以简单地用在副本中增加一个新成员并在启动时指定使用WiredTiger存储引擎。当你在运行时,通过设置为0 votes来隐藏这个副本,这样就不会影响到你的部署。 这个副本集新成员将和已存的成员进行初始同步。初始同步完成后,你可以从你的副本集中删除这个WiredTiger副本,然后连接到之前单独副本来比较你的数据库大小。对于你要测试的每个压缩选项,您可以重复这一过程。

 

另一种选择是使用mongodump导出你的数据并用它将其还原到一个独立的MongoDB 3.0实例。默认情况下您的集合将使用Snappy的压缩选项,但你在运行mongorestore之前,先创建具有相应设置的集合来指定不同选项,或者用不同的压缩选项启动mongod。这种方法能够导出/恢复特定的数据库,集合,或集合的子集来执行测试。

 

对于语法设置压缩选项的例子,请参见“如何使用压缩”部分。

 

固定集合(capped collection)须知

固定集合在MMAP存储引擎的实现与WiredTiger(和RocksDB)非常不同。在MMAP,空间在创建时被分配用于固定集合,而对于WiredTiger和RocksDB,只有当数据被添加到固定集合时,空间才被分配。如果你有很多空的或大部分空的固定集合,在不同的存储引擎之间的比较可能会因为这个原因出现误导。

 

MongoDB归档及压缩工具

本文地址:https://www.askmac.cn/archives/archiving-and-compression-in-mongodb-tools.html

 

介绍

 

我在MongoDB World 2015做的演讲“Putting the Go in MongoDB”,重点是关于MongoDB工具的重写,从C ++到Go,这在可用性以及性能方面得到了一些改进,但是这里我只简要的说两个方面的新功能,(planned for the 3.2 release) – 归档和压缩。

 

在本文中,我将对mongodump和mongorestore提供更详细的归档和压缩特性说明,并探索使用这些特性的可行用例。

 

概述

 

一个通常目的的归档一般由一个或多个文件组成。这样例子如磁带归档格式(tar),其中包含按顺序组成的一个或多个文件。归档在执行进程间通信的应用程序中尤其有用,例如,你可以通过远程服务器进行目录的tarball压缩,然后通过SSH,传送到到本机上进行解压:

由于归档以顺序的方式创建,接收端将能按顺序接收到发送端按顺序发来的数据。

 

在3.0中,我们增加了在MongoDB中并发执行备份和恢复多个集合的能力,这可以让你执行备份时,更加充分地利用磁盘I / O。 结果,写入mongodump的备份并不一定以顺序的方式接收。 同样,mongorestore同时读取还原操作集合,它的读取指令也并非是序列性的。

通用归档格式,如tar,只支持连续的文件归档打包。mongodump和mongorestore利用这些备份格式,将得到一个不可接受的性能退化, 由于所有集合的数据将不得不被按顺序写入和读出。为了支持这些工具的并发行为,我们研发了一个特殊的通用备份格式,支持非并发文件的写入。 这个新的归档特性极大了提高了备份和还原操作的效率。 

 

背景

 

为了按上下文情况进行备份,我们考虑一下你们通常是如何创建备份的。比如,假设你有一个“country”的数据库,其中含有两个集合-“nigeria” and “austria”, 你可能会这样操作:

上面的指令读取“country”数据库的所有集合, 然后将其写入“dump”目录。 上面的指令就会产生以下的目录列表:

你也可以备份整个服务器-这里的服务器包含两个数据库(country 和product)。

或选择备份单个集合到标准输出,而不是一个目录:

 

归档支持

 

在3.2中,我们引入了创建备份的一个附加模式 – “归档”模式,写入所有转储数据,甚至从不同的数据库和集合到单一的输出文件。 使用mongodump创建归档是极为简单的 – 只需要一个附加选项:

上面的指令将在“country.archive”文件中创建“country”的数据库归档。默认情况下,归档被写入到标准输出。不同于目录模式的执行备份,创建目录树,默认归档模式下备份结果就是一个单一的文件, 包含“country”数据库的所有数据-所有集合,索引等。 

 

你也可以备份一个单一的集合或整个服务器的内容:

单一集合:

整个服务器:

在mongodump的这种情况下,归档模式允许多个集合以非连续的方式打包在归档文件内。在mongorestore中,它允许多个集合进行并行恢复。这样,你可以在网络上执行数据迁移,降低磁盘I/O所占空间,享受到充分利用工具和底层存储引擎的并发所带来的好处。

 

数据迁移

 

一个新的备份改善的例子, 是mongodump和mongorestore之间的进程间通信 – 特别是能够将数据从一个传到另一个。在以前的版本中,这种支持有限 – 一个时间只能传输一个集合。现在,使用归档就没有这样的限制。这种方式对于数据库服务器出于安全考虑而安装有防火墙的情况下很有用。在这种情况下,一个通常的设计是允许一个或多个服务器方访问数据库。使用归档功能,在SSH上进行数据转移数据,就轻而易举了:

上面的指令使用SSH方式连接到代理主机(proxy.server.com),访问源服务器(source.server.com),在代理服务器上运行mongodump,为了最终的恢复,将源服务器的发送内容(通过SSH)到目标服务器(target.server.com)。

 

如果没有归档,通过mongodump完成这些操作的唯一办法就是,先执行备份到磁盘,在将文件复制到目标服务器,然后运行mongorestore。通过备份,一个指令就可以完成- 无需任何附加磁盘I/ O的开销。 

 

压缩支持

 

除了备份,我们还使用gzip进行压缩。这是通过在mongodump和mongorestore中引入一个新的指令行选项“- -gzip”实现的。 压缩可用于目录以及归档模型下创建的备份,压缩还可以减少磁盘空间使用。

生成:

注意,目录模型的归档备份大小-568KB-比没有压缩的备份要小很多-4.3MB.

 

压缩归档:

对于归档来说,数据在写入归档之前需要先压缩。 

恢复压缩目录模式备份,你应该运行:

类似用来恢复归档模式下的压缩备份的命令:

数据迁移不会产生任何磁盘I / O开销,由于压缩,将会使用更少的网络带宽。

 

总结

 

归档和压缩特性产生了许多用于进行备份和恢复操作的例子。如果你们正在使用MongoDB工具和其它类型的应用程序,我们也乐于倾听你们的经验及用例。 尽管目前最新版本工具还不文档,不过希望大家先对这些特性体验起来。

 

注:作为提供共享集群的集群范围快照的唯一备份解决方案,MongoDB Ops Manager和MongoDB Cloud Mannager被推荐用于较大的MongoDB部署。

使用Partition分区来提升您的MySQL数据库性能

使用Partition分区来提升您的MySQL数据库性能
By Antoinette O’Sullivan-Oracle

你可以通过使用分区来进一步提升你的MySQL数据库性能,将特定表行分成多个行集。可以在很多不同场景通过分区获得益处,如提升大表效率:

  • 将数据分成很多小组以提升查询效率
  • 符合系统文件大小限制
  • 对维护和删除等行操作进行加速

要了解更多关于分区和其他主要议题,欢迎大家来参加MySQL数据库管理员培训课程

 

你将通过以下形式来获得5天由教员引导的课程:

按需培训:在注册后24小时内即可开始课程,按照讲义材料并收看培训视屏学习,学习后你可以自己预定时间来Oracle实验室环境获取手把手教学体验。

在线虚拟教学:无需至Oracle培训地,你只需要在线参加线上班级课程即可。从一系列教学计划中选择对应时区的在线培训即可,你也可以选择不同时区不同语言的在线培训课程,一切如您所需。

实地培训:直接到Oracle教育培训中心参加课程,以下为亚洲区的培训计划安排:

ASIA

 Location  Date  Delivery Language
Shanghai, China 6 July 2015 Simplified Chinese
Causeway Bay, Hong Kong 11 May 2015 English
Bangalore, India 18 May 2015 English
Seoul, Korea 6 April 2015 Korean
Kuala Lumpur, Malaysia 17 August 2015 English
Petaling Jaya, Malaysia 11 May 2015 English
Pulau Pinang, Malaysia 17 August 2015 English
Pasig City, Philippines 8 June 2015 English
Singapore 6 April 2015 English
Bangkok, Thailand 15 June 2015 English

 

 

MySQL数据库管理课程被推荐给正准备参加MySQL 5.6数据库管理OCP认证考试的人。

关于MongoDB认证DBA Associate考试

From Mongo University,

mongo_university

下次开考时间:
Start: 2015年4月2日17:00
End: 2015年4月28日17:00

关于此考试

MongoDB认证DBA Associate级考试是为了具有MongoDB管理知识和技术的相关人员设立的。我们那些了解MongoDB相关基础知识并且具有一定专业管理经验的操作专家来进行认证。下面我们会详细说明对于此认证所需要具备的知识和技能:

考试细节

  • 考试将基于MongoDB 2.6版本进行。
  • 考试没有前提条件。任何人可以参与此认证考试,不过我们仍推荐大家进行一下自我学习或者参加M102和M202课程。考生也可以使用其他推荐学习准备材料
  • MongoDB认证考试提供在线网页监考解决方案。
  • 完成计算机设备检查以保证你的系统满足必要的硬件软件需要以完成考试。
  • 为了完成考试,你必须和你的监考方预约考试期。当然,一旦你注册了此考试,你就会收到相关的时间安排指导信息。
  • 你可以在考试期内的任何时间完成考试,早晚都行。
  • 一旦开考,考生将有90分钟来完成考试。
  • 对于不正确的回答不会倒扣分数。
  • 考试成绩将基于回答正确的题目的数量以及有专业评估作出的整体考试难度评判决定。
  • 考题类型为多选题,请将你认为正确的答案进行选择即可。
  • 在考试结束后,考试结果会在之后3周内得出。我们需要时间回顾考试时给出的问题并计算考试成绩。
  • 请注意考试费用中不会包括免费重考费用。

MongoDB所需知识:

  • 原理及特性:性能,JSON, BSON, 容错(fault tolerance),灾难恢复,水平缩放(horizontal scaling)以及Mongo shell
  • CRUD: 新建,读,更新和删除操作
  • 索引: 单键, 复合, 多键索引, 构成及性能
  • 聚合(Aggregation): 管道符, 操作符, 内存使用,排序(sort)、跳过(skip)和限制(limit)
  • 复制(Replication): 相关设置,oplog概念,写相关,枚举,故障转移及多个数据中心的部署
  • 分片(sharding):组件,何时分片,平衡,分片key,和哈希分片key
  • 应用管理: 数据文件,日志,认证及授权
  • 服务器管理:性能分析,诊断调试,运维,备份和恢复

所需通用IT知识
数据库概念基础
系统编程基础
基本的JavaScript编程能力

考试规则

  • 为了通过考试认证,测试者必须了解一下规则。视频,语音和计算机屏幕活动将会在考试时被记录获取并被考官回放检查。
  • 在认证过程中,测试者必须按提示提供以下信息:
  1. 一个清晰的头像照
  2. 一个官方出具并认可的照片,如驾照或护照
  3. 一份测试环境的视屏扫描
  • 考生必须独立在一个安静环境中进行考试。不允许和任何其他人进行交谈。
  • 在考试时,不会用到耳机,录音机,电视或其他计算机屏幕。
  • 考生仅被允许阅览考题,如果必要,可以使用如Google Translate这样的一个简单翻译工具。 其他的参考资料或软件都不可使用。

考试系统需求

  • Mac OS 10.6或以上,或Windows 7以上版本操作系统。Linux现在还不受支持。
  • 你需要一个摄像头和一个麦克风。

完成考试设备检查以保证你的系统满足考试的软硬件需要。

关于MySQL认证

关于MySQL认证

 

关于MySQL认证
By Denis Truffaut

MySQL是一个数据库管理系统。其认证被用于测试考生对于所有MySQL相关的存储和查询技术的知识掌握情况。

当前可在Oracle官网中可查到MySQL认证有以下两种:

  • Oracle Certified Professional, MySQL 5.6 Database Administrator
  • Oracle Certified Professional, MySQL 5.6 Developer

相关认证需要通过的考试:

  • MySQL 5.6数据库管理OCP:1Z0-883
  • MySQL 5.6开发员OCP:1Z0-882

值得注意的是下列旧认证将在2014年3月15日后过期, 如果你已经拥有以下认证,那么你需要考虑是否参与认证升级:

  • Oracle Certified Associate, MySQL 5
  • Oracle Certified Expert, MySQL 5.1 Cluster Database Administrator
  • Oracle Certified Professional, MySQL 5 Database Administrator
  • Oracle Certified Professional, MySQL 5 Developer

对于MySQL认证考试的反馈

当写这篇文章时,我才通过MySQL5 开发员认证。然而,我认为获取这些认证需要对相关知识有比较高的掌握度。

OCP5D

考试的题目都不简单,建议大家看题,并在考试时按顺序回答问题。注意,你可以对没把握的题先标记起来(使用【Mark】)然后在之后回到标记的题目。在最后回顾时,考试会提供对所有未回答或被标记问题的总览,在得到你的最后确认后,考生再按下【Finish】按钮完成考试。

最后,为了合理控制你的考试时间,在屏幕右上角有一个计时器方便你查看所用时间。

考试资源准备

考试中所需文档资源可以从下面找到:

OCP认证:请注意通过规则

每个考试需耗时90分钟,约包含70道题目,这意味着每题77秒的考虑时间。

你需要至少获得总考分的60%来通过考试。不过具体是否是此比例,你需要查看Oracle官网中的OCP相关考试说明来了解。

如果未能通过考试,你需要过14天后方能尝试申请重考。

OCP5certifation

MySQL OCP:总结 

为什么尝试此认证:

  • 相关费用(约1077RMB),性价比高
  • 一个考验自己知识掌握度的好方法
  • 一个高级别认证
  • 一个证明你是否专业的证据
  • 在求职市场上的一个快速认可
  • 全球知名品牌: Oracle

MySQL的配置

除了通过命令行来进行MySQL参数项配置之外,你还可以将设置写入一个配置文件中来实现设置。标准的MySQL客户端程序会在启动时查找此类配置文件并使用文件中的相应设置项。通过写配置文件可以大大减少你运维工作时间,因为你不必在每次调用程序的时候通过命令来重新定义这些参数项。

 

默认情况下,MySQL server会在运行时使用其预编译的值作为其配置项值。如果这些默认值在实际环境中是不适合的,你可以在server运行时给予不同的运行时参数值:

  • 有几个配置项定义了MySQL重要目录和文件的位置信息。如,Windows下,默认预编译的安装目录(base directory)为C:\mysql。如果你系统将MySQL安装在其他地方,你就必须通过使用 --basedir参数设置告知服务正确的目录位置,否则服务无法启动。同样的,如果你并非使用安装目录下的data子目录作为你的数据存放目录的话,你就必须使用 –datadir项设置来告诉服务正确的位置。
  • 有些配置项对MySQL server写哪些日志进行了控制。
  • 有些配置项被用于覆盖调整server中与性能相关的内部变量值,如控制最大同时连接数的配置项,控制buffer和cache大小的配置项等等。
  • 一些存储引擎在预编译时的设置为启用或禁用状态。如,服务程序已经编译启用了InnoDB支持(默认为启用),假如你并不使用InnoDB表的话,你可以设置 --skip-innodb项来节省内存(注意,由于现在InnoDB已成为标准配置,因此此参数在MySQL 5.7版本及其以后版本中被废用,这里仅作为例子进行说明)。你也可以设置默认存储引擎进行设置修改。
  • 有些配置项也可对InnoDB表空间进行进行设置。在未显式配置的情况下,如 --innodb_autoextend_increment, -- innodb_page_size等,这些值也可以根据你的情况进行调整。

你可以通过定义运行时配置项在服务启动时改变其表现。通常,这种设置可以通过命令行和配置文件来达到你的目的。(例外的是,如果你是以Window Service服务运行MySQL服务的话,你可能不能通过命令行来进行配置设置,你必须在启动时使用 --defaults-file 参数项,将配置设置于配置文件中。请依据对应版本而定。)

 

为了了解哪些配置项是server支持的,我们可以手工调用以下命令:

在帮助中所看到的那些配置项都可以使用mysqld命令时同时进行设置使用。当然,更常见的是将它们写入配置文件中,这都多方面原因:

  • 通过将配置项写入文件中,你可以不必每次在启动MySQL服务时将配置参数定义在命令中。这不仅方便,也可以避免太多复杂配置项造成的输入错误。
  • 如果你是通过server启动脚本来调用服务的话,你就不能通过在命令中加入配置项来进行启动。因为此脚本仅有参数值start和stop,这里你不需使用配置文件来进行启动设置。
  • 如果你在配置文件中列出有所有你所需的服务配置,你可以从文件中快速方便得了解你所进行的设置。

 

标准MySQL服务会在几个位置查找配置文件。它会使用那些在相应存放位置的配置文件,但是如果它找不到的话,服务也照样正常启动,不会报错。在Windows和Unix上,对应的标准配置文件有所不同。

 

在Windows上,程序会在目录(例如,C:\Winodws或C:\WinNT目录)中按以下顺序查找配置文件:my.ini,然后是my.cnf。

按目录查找的顺序如下:最上面的文件先读。

更多信息可阅读:http://dev.mysql.com/doc/refman/5.7/en/option-files.html

注意:如果你使用配置精灵进行的安装(即将MySQL server注册为一个Windows服务),那么服务就不会按照标准配置文件目录顺序进行查找,它仅会找MySQL安装目录下的my.ini文件。当然如果你在注册服务时使用 --defaults-file指定过配置文件,那么服务只会找你指定位置的那份配置文件。因此,如果你需要进行配置修改,请将设置放在服务会读的那个配置文件中。

 

在Unix上,所查找的配置文件则包括两个通用配置文件,/etc/my.cnf和$MYSQL_HOME/my.cnf。第二个文件仅在MYSQL_HOME环境变量已设置好的情况下才会被使用。通常你可以设置它作为MySQL安装目录。(如果在启动服务时此参数未设置,则mysql_safe脚本在执行时会尝试设置此MYSQL_HOME环境变量。) 

 

Unix配置文件的查找顺序中还包括了~/.my.cnf,配置文件可被放置在当前启动MySQL的用户HOME目录下。不过,由于此文件是一个特定于用户的文件,因此不太适合存放作为服务配置参数。(正常在你以root用户且使用 --user=mysql调用mysql服务时,服务会读取的特定用户配置文件取决于你调用服务的那个登陆用户,这可能会导致不一致的配置信息被使用。)

 

按目录查找的顺序如下:最上面的文件先读。

更多信息可阅读:http://dev.mysql.com/doc/refman/5.7/en/option-files.html

 

在配置文件中定义服务启动配置项时,使用[mysqld]组。如果文件不存在,那么你可以使用编辑器新建一个平文件。建立和修改文件需要对应的写入权限。MySQL服务本身仅需要读取权限即可;它会读取其中信息,但并不会新建或改动文件。

 

以下例子中,我们例举了一些使用配置文件进行设置的方法:

    • 如果在的MySQL安装在Windows上,服务假设默认安装目录为C:\mysql且数据子目录名为data。然而你希望将MySQL安装在其它地方,如: E:\mysql,你就必须使用 --basedir参数项告知服务对应路径。配置文件中的配置项前不用写双横杠【--】,你如下在配置文件中设置安装目录:
    • 如果你将E:\mysql下的data子目录作为数据目录,那basedir值已近足够了。不过如果你希望使用不同的数据目录路径,你就必须设置 --datadir项,如:
    • 请注意,在这种情况下,你也需要将原数据目录的拷贝到新对应位置D:\mysql-data上。如果不这样的话,当启动服务时,由于找不到配置文件对应的数据目录,会导致服务启动失败。
    • 对于配置参数中设置的Windows路径名,你可以使用斜杠【/】或者【\\】。例如,定义basedir值为E:\mysql,你可以以以下两种格式进行设置:
    • 如果路径名包含空格,你可以用双引号括起来,如:
    • 在Windows上,默认共享内存(shared-memory)连接方式是未启用的。为了使用此连接方式,使用以下配置项:

      类似,mysqld-nt和mysql-max-nt服务程序都在Windows平台上支持命名管道(named-pipe)连接方式,但它们都并未启用。为了启用这种连接方式,可使用以下配置项:

    • 为了启用日志,可以使用配置项启用你所希望的类型。以下配置项启用了通用查询日志,二进制日志以及长时间查询日志(以MySQL v5.7版本为例):
    • 为了定义默认存储引擎为InnoDB,可以使用 --default-storage-engine项:
    • 配置文件中也可设置许多MySQL服务系统变量值。例如,为了将最大客户端连接数从默认151提升至201,并增加MyISAM的键缓存(key cache)从8MB到128MB,你需要设置max_connections和key_buffer_size变量:

MySQL版本在v5.6.8之前包含有几个模板配置文件。在Windows中,文件名如my-small.ini和my-large.ini。这些被安装时同时建立在安装目录中。在Unix中,它们名为my-small.cnf和my-large.cnf。在my-default.cnf v5.6.8之后,这些文件被my-default.cnf文件代替。

 

你可以通过拷贝模板文件到标准配置文件路径上,将其文件名修改为指定所用配置文件名。不过在使用模板文件时,你需要确保能读懂文件中的意思,理解其中配置项设置的效果并作出相应修改。

 

3.5.1 使用 --safe-updates 配置项

 

配置文件中的配置项按组进行组织,每组配置项前都有一个以中括号括起来的组名(如:[group-name])。通常情况下,组名为所使用配置项对应的程序名。例如, [mysql]和[mysqldump]组对应的配置项被用于mysql和mysqldump命令工具。而特别的组名如[client]则被用于所有客户端程序。一般[client]组被设置连接配置参数,因为不管你使用哪个客户端程序都连接到此相同server上。

 

在配置文件中进行设置时,请将使用于命令行时的参数前的双横杠去掉。如果配置项设置一个值,可与允许在等号【=】两边有空格,不过在用于命令行时,这是不允许的。以下为一个配置文件例子:

注意:除非服务由root用户启动,否则端口号必须为1024或比之更大的值。

 

在上面这个例子中,[client]组定义了主机名,且设定C/S访问协议需使用压缩模式进行发送。组中的配置项应用于所有标准的客户端。而[mysql]组仅应用于客户端程序mysql。[mysql]组的设置要求了mysql命令应该使用 --safe-updates项。(mysql命令程序将会同时使用[client]和[mysql]组中的配置,因此总共有3个配置项被mysql使用。)

 

3.5.2 配置文件位置

 

配置文件的位置取决于你的操作系统。标准配置文件如:

  • 在Windows上,一般MySQL会按以下顺序查找配置文件: my.ini和cnf。而MSI安装精灵会将配置文件放置在服务注册设定时所指定的位置下)。
  • 在Unix平台上,文件/etc/my.cnf将作为全局配置文件被所有用户使用。你也可以在你的HOME目录中建立用户自己定义的cnf文件。如果两个都存在,全局文件会被先读取。
  • 当然,MySQL的命令行程序会在查找$HOME目录下的配置文件前,先在$MYSQL_HOME目录下查找配置文件(例如,../MySQL Server 5.6)。

 

MySQL(客户端)程序也可以对多个配置文件进行访问。程序会查找每个标准配置文件并在文件存在时进行读取。如果文件不存在也不会报错。

如果需要使用某个配置文件,你可以使用编辑器建立一个平文件进行编辑。

为了建立或修改此文件,你必须有相应的写权限。客户端程序仅需读权限即可。 

为了告知程序读取指定的配置文件,使用命令行启动时可使用以下参数项(在命令中必须是第一个参数项):

配置项 注释
--defaults-file=file_name 使用指定位置的配置文件
--defaults-extra-file=file_name 使用指定位置的额外配置文件
--no-defaults 使程序不使用配置文件

例如,使用mysql工具命令时使用C:\my-opts配置文件而不使用标准配置文件:

在配置文件中,你还可以使用 !include!includedir指令:

  • 如果某行中出现 !include file_name,那就会从这句指令开始跳转到对应file_name进行读取,读完后再调回原先的配置文件继续之前的读取。
  • 如果某行中出现 !includedir dir_name,那么类似的会从这句指令开始跳转到对应dir_name目录并查找尾缀为.cnf的文件(Windows平台上为.cnf和.ini)进行配置读取,在读完后回到之前跳出的配置文件完成余下的读取工作。

 

如果一个配置项被定义多次,不管是在同一个文件中还是在不同的多个配置文件中,配置项的值取最后设置的那个。

注意:在命令行中设置的配置项会最终覆盖配置文件读取的配置项的值。

MySQL的SQL模式

本文地址:https://www.askmac.cn/archives/mysql-sql-mode.html

 

 

3.6.1 设置SQL模式

 

MySQL Server中的许多操作特性可以通过设置SQL模式(SQL mode)来进行配置。模式包含了可选值,其每个值控制了查询处理的某个方面。经过恰当的设置,服务就能按指导对输入数据采取严格或宽容的处理,启用或禁用对SQL一致性有关的操作,或者提供对其它数据库更好的兼容性。这一节将讨论如何设置SQL模式。

 

默认情况下,SQL模式值为空值,因此没有特定的限制或一致性行为要求被启用。独立的客户端按他们自己的需要来配置SQL模式,不过也可以通过在服务启动时使用 --sql-mode项来设置默认的SQL模式。你可能在运行数据库时需要某个模式来更小心地处理无效数据或建立MySQL用户账号。例如,如果你启用TRADITIONAL模式,MySQL Server会如其它数据库一样对输入的数据进行强制约束,而不会采取宽容态度。它这种模式不会允许未设置密码的新账号被建立。你可以通过配置文件来启用TRADITIONAL SQL模式:

 

你可以在启动mysqld时使用 --sql-mode=”mode_value”来设置SQL模式,或者可以通过使用SET命令来设置sql_mode变量来实现:

设置的值可以是空值,或是由一个或多个模式使用逗号组成的混合模式。如果是空值或两个以上模式值,你需要用单引号括起来。尽管SQL模式值在设置时总是使用大写,但是实际上其对大小写不敏感,以下是一些例子:

 

  • 清空SQL模式值:
SET sql_mode=’’;
  • 使用单个模式值对SQL模式进行设置:
SET sql_mode=ANSI_QUOTES;SET sql_mode=’TRADITIONAL’;
  • 使用多个模式值对SQL模式进行设置:
SET sql_mode=’IGNORE_SPACE,ANSI_QUOTES’;

 

如果需要检查当前sql_mode设置,可以使用以下命令:

 

3.6.2 SQL模式值

 

以下列出了对一些通用模式值的简单描述:

  • ANSI_QUOTES

此模式将导致双引号【”】被用于作为标识符引用字符,而不能用于作为字符串引用字符。

  • IGNORE_SPACE

默认情况下,功能函数和括号之间不能有空格。启用此模式后,服务会无视功能后的空格。这将允许功能函数和括号间有空格,但这有可能导致有些功能被认作为保留字。

  • ERROR_FOR_DIVISION_BY_ZERO

默认,被0除后所得返回结果为NULL。启用此模式后,在插入表数据的内容中,如果存在除以0,将会生成警告,如果同时也启用了严格模式,则会返回错误。(在MySQL 5.7.4以后,此模式被合并入STRICT_ALL_TABLES,STRICT_TRANS_TABLES模式中)

  • STRICT_TRANS_TABLES, STRICT_ALL_TABLES

这些模式值启用了【严格模式(strict mode)】,它对数据库输入可接受的值进行了某些严格限定。默认,MySQL会对于某些遗漏的值,超出范围,或奇怪的值采取宽容处理。启用严格模式将造成这些值在录入时被报错处理。

STRICT_TRANS_TABLES 启用了对所有事务表的严格模式,而STRICT_ALL_TABLES启用了对所有表的严格模式。

  • TRADITIONAL

这是一个复合模式,它在启用严格模式的同时还加入了其它一些输入数据的采纳限制。

  • ANSI

这也是一个复合模式,启用它会导致MySQL Server更符合ANSI标准。也就是说,其表现行为更像标准SQL,如其模式中含有ANSI_QUOTES(之前提到的)和PIPES_AS_CONCAT,使用【||】来作为字符串连接符,而不是作为逻辑或操作。

 

注意: 官方文档手册中列出所有可用的SQL模式值,如需查看MySQL5.7相关模式值,可访问:

 

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

 

 

 

沪ICP备14014813号-2

沪公网安备 31010802001379号