<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>优优博库</title>
	<atom:link href="http://www.uuboku.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.uuboku.com</link>
	<description>与你分享优质博文</description>
	<lastBuildDate>Wed, 29 Jun 2016 02:58:08 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>mysql 数据类型 Float、Double、Decimal和Numeric  的区别</title>
		<link>http://www.uuboku.com/455.html</link>
		<comments>http://www.uuboku.com/455.html#comments</comments>
		<pubDate>Tue, 28 Jun 2016 09:05:19 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=455</guid>
		<description><![CDATA[mysql 数据类型 Float、Double、Decimal和Numeric &#160;的区别 前几天解决 [...]]]></description>
			<content:encoded><![CDATA[<p>
	<a href="http://www.uuboku.com/455.html" target="_blank">mysql 数据类型 Float、Double、Decimal和Numeric &nbsp;的区别</a>
</p>
<p>
	
</p>
<p>
	前几天解决了一个这样的问题：数据是从一个地方爬取过来的，爬取前显示的数据是 901.63 &nbsp;；然后，爬取数据脚本最后计算的总和也是901.63 一切都没有问题；
</p>
<p>
	但是，我们通过自己的数据库mysql计算出来的值就是601.62。查看了数据条数和对应的值都是对的，把数据导出到Excel后，数据求和也是 901.63，这不是怪了。
</p>
<p>
	最后发现是 mysql数据库字段设置了Float搞的鬼。
</p>
<p>
	
</p>
<p>
	其实，这是个老生常谈的问题了，这里做下备注，以便以后查阅
</p>
<p>
	
</p>
<p>
	<strong>MySQL中存在Float,Double等非标准数据类型，</strong><strong>也有Decimal、Numeric这种标准数据类型。</strong><br />
<strong>其区别在于，Float，Double等非标准类型，在DB中保存的是近似值，而Decimal则以字符串的形式保存数值。</strong>
</p>
<p>
	<strong><br />
</strong>
</p>
<p>
	<strong>Float数值类型用于表示单精度浮点数值，而Double数值类型用于表示双精度浮点数值，Float和Double都是浮点型，而Decimal是定点型；<br />
MySQL 浮点型和定点型可以用类型名称后加（M，D）来表示，M表示该值的总共长度，D表示小数点后面的长度，M和D又称为精度和标度，<br />
如float(7,4)的 可显示为-999.9999，MySQL保存值时进行四舍五入，如果插入999.00009，则结果为999.0001。<br />
Float和Double在不指 定精度时，默认会按照实际的精度来显示，而Decimal在不指定精度时，默认整数为10，小数为0</p>
<p></strong>
</p>
<p>
	<strong>同时，对数据求SUM()时会出现不同的结果，Float和Double求SUM都会出现很多小数点，而D</strong><strong>ecimal求SUM得到的是精准数值：</strong>
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	decimal 和 numeric 是同义，都是用于精确存储数值 。
</p>
<p>
	
</p>
<p>
	综上所述：<span style="background-color:#FFFFFF;"><span style="color:#E53333;"></span></span>
</p>
<p>
	<strong><span style="color:#E53333;background-color:#FFFFFF;">Mysql 存储小数的时候，大多数和金额有关系。Float和Double存在精度的问题，所以首选还是要用 Decimal和Numeric，就我个人而言 &nbsp;Numeric 用的比较多。</span></strong>
</p>
<p>
	
</p>
<p>
	网上相关的例子也比较多贴出来，也可以看一下
</p>
<p>http://www.th7.cn/db/mysql/201411/82120.shtml</p>
<p>http://blog.sina.com.cn/s/blog_7e89c3f50101eh7t.html</p>
<p>http://www.cnblogs.com/gulibao/p/5416245.html</p>
<p>http://www.cnblogs.com/qiantuwuliang/archive/2010/11/03/1867802.html</p>
<p>
	以上文章都是说的一个事，看看就好了
</p>
<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/455.html" target="_blank">mysql 数据类型 Float、Double、Decimal和Numeric &nbsp;的区别</a>
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/455.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别</title>
		<link>http://www.uuboku.com/444.html</link>
		<comments>http://www.uuboku.com/444.html#comments</comments>
		<pubDate>Tue, 28 Jun 2016 08:03:06 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=444</guid>
		<description><![CDATA[mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区 [...]]]></description>
			<content:encoded><![CDATA[<p>
	<a href="http://www.uuboku.com/444.html" target="_blank">mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别</a>
</p>
<p>
	
</p>
<p>
	今天无意间看到 mysql sql_mode 这个配置，就仔细看下了下，做个记录备忘下。
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
</pre>
<p>
	查阅了一下线上一台服务器，sql_mode的配置是 &nbsp;STRICT_TRANS_TABLES
</p>
<p>
	
</p>
<p>
	STRICT_TRANS_TABLES 和STRICT_ALL_TABLES 区别，简要说明下
</p>
<p>
	<span><strong>mysql的官方说明中提出：</strong><br />
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如，数据类型错误，不适合列，或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值，则该值被丢失。<br />
&nbsp;<br />
对于事务表，当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时，如果语句中有非法或丢失值，则会出现错误。语句被放弃并滚动。<br />
&nbsp;<br />
对于非事务表，如果插入或更新的第1行出现坏值，两种模式的行为相同。语句被放弃，表保持不变。如果语句插入或修改多行，并且坏值出现在第2或后面的行，结果取决于启用了哪个严格选项：<br />
&nbsp;<br />
· 对于STRICT_ALL_TABLES，MySQL返回错误并忽视剩余的行。但是，在这种情况下，前面的行已经被插入或更新。这说明你可以部分更新，这可能不是你想要的。要避免这点，最好使用单行语句，因为这样可以不更改表即可以放弃。<br />
&nbsp;<br />
· 对于STRICT_TRANS_TABLES，MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失，MySQL在列中插入隐式 默认值。在任何情况下，MySQL都会生成警告而不是给出错误并继续执行语句。<br />
&nbsp;<br />
以下是一个例子分析：<br />
1：如果sql语句操作的是事务表（innodb类型）的时候，STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式对数据的影响是一样的。<br />
需要注意的是：<br />
在事务中如果某个sql更新数据的语句报错，那么这条语句下面的未语句都不会执行，这条语句上面已经执行的语句会事务结束的时候commit<br />
这是需要我们捕捉错误，让事务回滚。<br />
&nbsp;<br />
例子如下：<br />
CREATE TABLE `t1` (<br />
&nbsp; `f1` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `f2` varchar(2) NOT NULL,<br />
&nbsp; UNIQUE KEY `f1` (`f1`)<br />
) ENGINE=innodb AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC<br />
&nbsp;<br />
DELIMITER $$<br />
&nbsp;<br />
DROP PROCEDURE IF EXISTS `pr_test`$$<br />
&nbsp;<br />
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `pr_test`()<br />
BEGIN<br />
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK;END;<br />
&nbsp; &nbsp;START TRANSACTION;<br />
INSERT INTO t1 (f2) VALUES (&#8216;cd&#8217;);<br />
INSERT INTO t1 (f2) VALUES (&#8216;abc&#8217;);<br />
INSERT INTO t1 (f2) VALUES (&#8216;de&#8217;);<br />
COMMIT;<br />
&nbsp; &nbsp; END$$<br />
&nbsp;<br />
DELIMITER ;<br />
&nbsp;<br />
2：如果sql语句操作的是事务表。<br />
两个区别是<br />
INSERT INTO t1 (f2) VALUES (&#8216;ab&#8217;),(&#8216;acd&#8217;);<br />
如果是STRICT_ALL_TABLES<br />
结果是:<br />
f1 &nbsp; &nbsp;f2<br />
1 &nbsp; &nbsp; ab<br />
如果是STRICT_TRANS_TABLES<br />
结果是:<br />
f1 &nbsp; &nbsp;f2<br />
1 &nbsp; &nbsp; ab<br />
2 &nbsp; &nbsp; ac<br />
</span>
</p>
<div>
	
</div>
<p></p>
<p>
	
</p>
<p>
	<span><br />
</span>
</p>
<p>
	<span><a href="http://www.uuboku.com/444.html" target="_blank">mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别</a></span>
</p>
<p>
	<span style="font-size:12px;line-height:1.5;"></span>
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/444.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>show profiles mysql查询优化之profile</title>
		<link>http://www.uuboku.com/424.html</link>
		<comments>http://www.uuboku.com/424.html#comments</comments>
		<pubDate>Tue, 05 Apr 2016 01:47:54 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=424</guid>
		<description><![CDATA[show profiles mysql查询优化之profile 当mysql遇到性能瓶颈时，从mysql本身出 [...]]]></description>
			<content:encoded><![CDATA[<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/424.html" target="_blank">show profiles mysql查询优化之profile</a>
</p>
<p>
	
</p>
<p>
	当mysql遇到性能瓶颈时，从mysql本身出发去优化大致分为两个方面。一个是调整mysql的配置参数，另一个是优化查询sql了。
</p>
<p>
	查看sql运行时间是必不可少的，这时候profile就相当重要了。
</p>
<p>
	
</p>
<p>
	<strong>1、查看profile是否打开，以下三种方法都的可以的。</strong>
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show profiles;
Empty set, 1 warning (0.00 sec)
</pre>
<pre class="prettyprint lang-bsh">mysql&gt; show variables like "profiling%";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling              | OFF   |
| profiling_history_size | 15    |
+------------------------+-------+
2 rows in set (0.00 sec)

mysql&gt; </pre>
<pre class="prettyprint lang-bsh">mysql&gt; select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql&gt;</pre>
<p>以上结果可以看出，profile没有打开。我们在当前Session会话状态打开profile；</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<strong>2、</strong><span><strong>当前Session会话状态打开profile</strong></span>
</p>
<p>
	开启 Query Profiler 功能之后，MySQL 就会自动记录所有执行的 Query 的 profile 信息了。
</p>
<pre class="prettyprint lang-bsh">mysql&gt; set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql&gt; show variables like "profiling";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql&gt; 
</pre>
<p><strong>3、查看sql运行时间</strong> </p>
<p>
	获取系统中保存的所有 Query 的 profile 概要信息
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show databases;
+---------------------+
| Database            |
+---------------------+
| yw_mdmall           |
+---------------------+
1 rows in set (0.00 sec)

mysql&gt; use yw_mdmall;
Database changed
mysql&gt; select id from yw_order limit 10;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
+----+
10 rows in set (0.00 sec)

mysql&gt; show profiles;
+----------+------------+----------------------------------+
| Query_ID | Duration   | Query                            |
+----------+------------+----------------------------------+
|        1 | 0.00036950 | show databases                   |
|        2 | 0.00010925 | SELECT DATABASE()                |
|        3 | 0.00021900 | select id from yw_order limit 10 |
+----------+------------+----------------------------------+
3 rows in set, 1 warning (0.00 sec)

mysql&gt; 
</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	<strong>查看最后一条sql的执行详细信息</strong>
</p>
<p>
	通过执行 “SHOW PROFILE” 命令获取当前系统中保存的多个 Query 的 profile 的概要信息。
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show profile;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000055 |
| checking permissions | 0.000009 |
| Opening tables       | 0.000023 |
| init                 | 0.000017 |
| System lock          | 0.000008 |
| optimizing           | 0.000006 |
| statistics           | 0.000013 |
| preparing            | 0.000012 |
| executing            | 0.000003 |
| Sending data         | 0.000038 |
| end                  | 0.000005 |
| query end            | 0.000007 |
| closing tables       | 0.000008 |
| freeing items        | 0.000012 |
| cleaning up          | 0.000005 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

mysql&gt; </pre>
<p>
	
</p>
<p>
	
</p>
<p>
	<strong>查看指定 Query_ID 对应sql的执行详细信息</strong>
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show profile for query 3;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000055 |
| checking permissions | 0.000009 |
| Opening tables       | 0.000023 |
| init                 | 0.000017 |
| System lock          | 0.000008 |
| optimizing           | 0.000006 |
| statistics           | 0.000013 |
| preparing            | 0.000012 |
| executing            | 0.000003 |
| Sending data         | 0.000038 |
| end                  | 0.000005 |
| query end            | 0.000007 |
| closing tables       | 0.000008 |
| freeing items        | 0.000012 |
| cleaning up          | 0.000005 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

mysql&gt; show profile for query 2;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000041 |
| checking permissions | 0.000008 |
| Opening tables       | 0.000007 |
| init                 | 0.000012 |
| optimizing           | 0.000006 |
| executing            | 0.000008 |
| end                  | 0.000005 |
| query end            | 0.000004 |
| closing tables       | 0.000004 |
| freeing items        | 0.000011 |
| cleaning up          | 0.000005 |
+----------------------+----------+
11 rows in set, 1 warning (0.00 sec)

mysql&gt; 
mysql&gt; show profile for query 1;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000032 |
| checking permissions | 0.000006 |
| Opening tables       | 0.000042 |
| init                 | 0.000008 |
| System lock          | 0.000005 |
| optimizing           | 0.000004 |
| statistics           | 0.000010 |
| preparing            | 0.000011 |
| executing            | 0.000185 |
| Sending data         | 0.000023 |
| end                  | 0.000005 |
| query end            | 0.000004 |
| closing tables       | 0.000003 |
| removing tmp table   | 0.000013 |
| closing tables       | 0.000004 |
| freeing items        | 0.000011 |
| cleaning up          | 0.000005 |
+----------------------+----------+
17 rows in set, 1 warning (0.00 sec)
</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	<strong>查看最后一条sql的执行 cpu、io、内存、交换内存等 信息</strong>
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show profile cpu,block io,memory,swaps,context switches,source for query 3;
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+-------+-----------------------+------------------+-------------+
| Status               | Duration | CPU_user | CPU_system | Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out | Swaps | Source_function       | Source_file      | Source_line |
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+-------+-----------------------+------------------+-------------+
| starting             | 0.000055 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | NULL                  | NULL             |        NULL |
| checking permissions | 0.000009 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | check_access          | sql_parse.cc     |        5268 |
| Opening tables       | 0.000023 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | open_tables           | sql_base.cc      |        4934 |
| init                 | 0.000017 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_prepare_select  | sql_select.cc    |        1050 |
| System lock          | 0.000008 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_lock_tables     | lock.cc          |         304 |
| optimizing           | 0.000006 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | optimize              | sql_optimizer.cc |         138 |
| statistics           | 0.000013 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | optimize              | sql_optimizer.cc |         362 |
| preparing            | 0.000012 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | optimize              | sql_optimizer.cc |         485 |
| executing            | 0.000003 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | exec                  | sql_executor.cc  |         110 |
| Sending data         | 0.000038 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | exec                  | sql_executor.cc  |         190 |
| end                  | 0.000005 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_execute_select  | sql_select.cc    |        1105 |
| query end            | 0.000007 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_execute_command | sql_parse.cc     |        4967 |
| closing tables       | 0.000008 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_execute_command | sql_parse.cc     |        5015 |
| freeing items        | 0.000012 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | mysql_parse           | sql_parse.cc     |        6294 |
| cleaning up          | 0.000005 | 0.000000 |   0.000000 |                 0 |                   0 |            0 |             0 |     0 | dispatch_command      | sql_parse.cc     |        1774 |
+----------------------+----------+----------+------------+-------------------+---------------------+--------------+---------------+-------+-----------------------+------------------+-------------+
15 rows in set, 1 warning (0.00 sec)

mysql&gt;</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; show profile block io,cpu for query 3;
+----------------------+----------+----------+------------+--------------+---------------+
| Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+----------+----------+------------+--------------+---------------+
| starting             | 0.000056 | 0.000000 |   0.000000 |            0 |             0 |
| checking permissions | 0.000009 | 0.000000 |   0.000000 |            0 |             0 |
| Opening tables       | 0.000023 | 0.000000 |   0.000000 |            0 |             0 |
| init                 | 0.000017 | 0.000000 |   0.000000 |            0 |             0 |
| System lock          | 0.000008 | 0.000000 |   0.000000 |            0 |             0 |
| optimizing           | 0.000006 | 0.000000 |   0.000000 |            0 |             0 |
| statistics           | 0.000012 | 0.000000 |   0.000000 |            0 |             0 |
| preparing            | 0.000012 | 0.000000 |   0.000000 |            0 |             0 |
| executing            | 0.000003 | 0.000000 |   0.000000 |            0 |             0 |
| Sending data         | 0.000039 | 0.000000 |   0.000000 |            0 |             0 |
| end                  | 0.000005 | 0.000000 |   0.000000 |            0 |             0 |
| query end            | 0.000007 | 0.000000 |   0.000000 |            0 |             0 |
| closing tables       | 0.000009 | 0.000000 |   0.000000 |            0 |             0 |
| freeing items        | 0.000012 | 0.000000 |   0.000000 |            0 |             0 |
| cleaning up          | 0.000004 | 0.000000 |   0.000000 |            0 |             0 |
+----------------------+----------+----------+------------+--------------+---------------+
15 rows in set, 1 warning (0.00 sec)

mysql&gt;</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	小结：要想优化一条 Query，我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里，是消耗的 CPU计算太多，还是需要的的 IO 操作太多？要想能够清楚的了解这些信息，在 MySQL 5.0 和 MySQL 5.1正式版中已经可以非常容易做到了（Mysql 5.0.37 之后，自带SHOW PROFILES and SHOW PROFILE 功能模块），那就是通过 Query Profiler 功能。</p>
<p>MySQL 的 Query Profiler 是一个使用非常方便的 Query 诊断分析工具，通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况，如 CPU，IO，IPC，SWAP 等，以及发生的 PAGE FAULTS，CONTEXT SWITCHE 等等，同时还能得到该 Query 执行过程中 MySQL 所调用的各个函数在源文件中的位置。
</p>
<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/424.html" target="_blank">show profiles mysql查询优化之profile</a>
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/424.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql 用户变量（@）和系统变量（@@ show variables 和 show global variables 区别）</title>
		<link>http://www.uuboku.com/392.html</link>
		<comments>http://www.uuboku.com/392.html#comments</comments>
		<pubDate>Fri, 01 Apr 2016 09:29:03 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=392</guid>
		<description><![CDATA[mysql 用户变量（@）和系统变量（@@ show variables 和 show global vari [...]]]></description>
			<content:encoded><![CDATA[<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/392.html" target="_blank">mysql 用户变量（@）和系统变量（@@ show variables 和 show global variables 区别）</a>
</p>
<p>
	
</p>
<p>
	
</p>
<h2>
	<strong><span style="color:#006600;">用户变量</span></strong><br />
</h2>
<p>
	
</p>
<p>
	用户变量是针对当前登录MYSQL的用户的私有变量，可以先在用户变量中保存值然后在以后引用它；这样可以将值从一个语句传递到另一个语句。
</p>
<p>
	
</p>
<p>
	用户变量与<span style="line-height:1.5;">连接有关。<strong><span style="color:#006600;">也就是说，一个客户端定义的变量不能被其它客户端看到或使用</span></strong>。<strong>当客户端退出时，该客户端</strong></span><span style="line-height:1.5;"><strong>连接的所有变量将自动释放。</strong></span>
</p>
<p>
用户变量的形式为@var_name，其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和</p>
<p>‘$’组成。 默认字符集是cp1252 (Latin1)。可以用mysqld的&#8211;default-character-set选项更改字符集</p>
<p>。用户变量名对大小写不敏感。</p>
<p>设置用户变量的一个途径是执行SET语句：</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">SET @var_name = expr [, @var_name = expr] ...</pre>
<p>
	
</p>
<p>对于SET，可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。</p>
<p>也可以用语句（表达式）代替SET来为用户变量分配一个值。在这种情况下，分配符必须为:=而不能用=，因为在非</p>
<p>SET语句中=被视为一个比较 操作符：</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SET @t1=0, @t2=0, @t3=0;
mysql&gt; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+</pre>
<p>
	
</p>
<p>用户变量可以用于表达式中。目前不包括明显需要文字值的上下文中，例如SELECT语句的LIMIT子句，或</p>
<p>者LOAD DATA语句的IGNORE number LINES子句。</p>
<p>如果使用没有初始化的变量，其值是NULL。</p>
<p>如果用户变量分配了一个字符串值，其字符集和校对规则与该字符串的相同。用户变量的可压缩性</p>
<p>（coercibility）是隐含的。(即为表列值的相同的可压缩性（coercibility）。</p>
<p><strong><span style="color:#006600;">注释：在SELECT语句中，表达式发送到客户端后才进行计算。这说明在HAVING、GROUP BY或者ORDER BY子</span></strong></p>
<p><strong><span style="color:#006600;"> 句中，不能使用包含SELECT列表中所设的变量的表达式。</span></strong>例如，下面的语句不能按期望工作：</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SELECT (@aa:=id) AS a，(@aa+3) AS b 从tbl_name HAVING b=5；</pre>
<p>
	
</p>
<p>HAVING子句中引用了SELECT列表中的表达式的别名，使用@aa。不能按期望工作：@aa不包含当前行的值，</p>
<p>而是前面所选的行的id值。</p>
<p>一般原则是不要在语句的一个部分为用户变量分配一个值而在同一语句的其它部分使用该变量。可能会得</p>
<p>到期望的结果，但不能保证。</p>
<p>设置变量并在同一语句中使用它的另一个问题是变量的默认结果的类型取决于语句前面的变量类型。下面</p>
<p>的例子说明了该点：</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SET @a='test';
mysql&gt; SELECT @a,(@a:=20) FROM tbl_name;</pre>
<p>
	
</p>
<p>对于该 SELECT语句，MySQL向客户端报告第1列是一个字符串，并且将@a的所有访问转换为字符串，即使</p>
<p>@a在第2行中设置为一个数字。执行完SELECT语句后，@a被视为下一语句的一个数字。</p>
<p>要想避免这种问题，要么不在同一个语句中设置并使用相同的变量，要么在使用前将变量设置为0、0.0或</p>
<p>者&#8221;以定义其类型。</p>
<p>未分配的变量有一个值NULL，类型为字符串。</p>
<h2>
	<span style="color:#006600;">系统变量</span><br />
</h2>
<p>MySQL可以访问许多系统和连接变量。当服务器运行时许多变量可以动态更改。这样通常允许你修改服务</p>
<p>器操作而不需要停止并重启服务器。</p>
<p>mysqld服务器维护两种变量。<span style="color:#006600;"><strong>全局变量</strong></span>影响服务器整体操作。<strong><span style="color:#006600;">会话变量</span></strong>影响具体客户端连接的操作。</p>
<p>当服务器启动时，它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的</p>
<p>选项进行更改。服务器启动后，通过连接服务器并执行SET GLOBAL var_name语句，可以动态更改这些全</p>
<p>局变量。要想更改全局变量，必须具有SUPER权限。</p>
<p>服务器还为<strong><span style="color:#006600;">每个连接的客户端维护一系列会话变量</span></strong>。在连接时使用相应全局变量的当前值对客户端的会话</p>
<p>变量进行初始化。对于动态会话变量，客户端可以通过SET SESSION var_name语句更改它们。设置会话变</p>
<p>量不需要特殊权限，但<strong><span style="color:#006600;">客户端只能更改自己的会话变量，而不能更改其它客户端的会话变量</span></strong>。</p>
<p><strong><span style="color:#006600;">对于全局变量的更改可以被访问该全局变量的任何客户端看见。然而，它只影响更改后连接的客户的从该</span></strong></p>
<p><strong><span style="color:#006600;"> 全局变量初始化的相应会话变量。不影响目前已经连接的客户端的会话变量(即使客户端执行SET GLOBAL</span></strong></p>
<p>
	<strong><span style="color:#006600;"> 语句也不影响)。</span></strong>
</p>
<p>
	<strong><span style="color:#006600;"><br />
</span></strong>
</p>
<p>
	<strong><span style="color:#006600;"><br />
</span></strong>
</p>
<p>
可以使用几种语法形式来设置或检索全局或会话变量。下面的例子使用了sort_buffer_sizeas作为示例变</p>
<p>量名。</p>
<p>要想设置一个GLOBAL变量的值，使用下面的语法：</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SET GLOBAL sort_buffer_size=value;
mysql&gt; SET @@global.sort_buffer_size=value;</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	要想设置一个SESSION变量的值，使用下面的语法：
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SHOW VARIABLES like 'sort_buffer_size';
mysql&gt; SHOW SESSION VARIABLES like 'sort_buffer_size';
mysql&gt; SELECT @@sort_buffer_size;
mysql&gt; SELECT @@session.sort_buffer_size;
</pre>
<p>
	
</p>
<p>
	
</p>
<p>LOCAL是SESSION的同义词。</p>
<p>如果设置变量时不指定GLOBAL、SESSION或者LOCAL，默认使用SESSION。</p>
<p>
	要想检索一个GLOBAL变量的值，使用下面的语法：
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">mysql&gt; SHOW GLOBAL VARIABLES like 'sort_buffer_size';（可搜索多个变量 例如：SHOW GLOBAL VARIABLES like '%buffer%';）
mysql&gt; SELECT @@global.sort_buffer_size;（不能搜索多个变量 ）</pre>
<p>
	
</p>
<p>
	
</p>
<p>要想检索一个SESSION变量的值，使用下面的语法：</p>
<p>
	
</p>
<p>
	
</p>
<p><pre class="prettyprint lang-bsh">mysql&gt; SHOW VARIABLES like 'sort_buffer_size';（可搜索多个变量 例如：SHOW VARIABLES like '%buffer%';）
mysql&gt; SHOW SESSION VARIABLES like 'sort_buffer_size';
mysql&gt; SELECT @@sort_buffer_size;
mysql&gt; SELECT @@session.sort_buffer_size;
</pre>
</p>
<p>这里，LOCAL也是SESSION的同义词。</p>
<p>当你用SELECT @@var_name搜索一个变量时(也就是说，不指定global.、session.或者local.)，MySQL返</p>
<p>回SESSION值（如果存在），否则返回GLOBAL值。</p>
<p>对于SHOW VARIABLES，如果不指定GLOBAL、SESSION或者LOCAL，MySQL返回SESSION值。</p>
<p>当设置GLOBAL变量需要GLOBAL关键字但检索时不需要它们的原因是防止将来出现问题。如果我们移除一个</p>
<p>与某个GLOBAL变量具有相同名字的SESSION变量，具有SUPER权限的客户可能会意外地更改GLOBAL变量而不</p>
<p>是它自己的连接的SESSION变量。如果我们添加一个与某个GLOBAL变量具有相同名字的SESSION变量，想更</p>
<p>
	改GLOBAL变量的客户可能会发现只有自己的SESSION变量被更改了。
</p>
<p>
	
</p>
<p>
	<strong><span style="color:#E53333;">全局变量小结：</span></strong>
</p>
<p>
	
</p>
<div>
	<strong><span style="color:#E53333;">①、无论是修改本次会话的变量还是全局变量，当mysql服务器重启时，都会失效。要想永久生效，还是要将</span></strong>
</div>
<div>
	<strong><span style="color:#E53333;">配置写入my.ini的配置文件的。</span></strong>
</div>
<div>
	
</div>
<div>
	<strong><span style="color:#E53333;">②&gt;、对于全局变量的更改可以被访问该全局变量的任何客户端看见。然而，它只影响更改后连接的客户的从该</span></strong>
</div>
<div>
	<strong><span style="color:#E53333;">全局变量初始化的相应会话变量。不影响目前已经连接的客户端的会话变量(即使客户端执行SET GLOBAL</span></strong>
</div>
<div>
	<strong><span style="color:#E53333;">语句也不影响)。简而言之，全局变量修改后，客户端必须重新连接才会生效。</span></strong>
</div>
<div>
	
</div>
<div>
	<strong><span style="color:#E53333;">③&gt;、对于局部变量修改后，只会对本次连接生效，</span></strong><strong><span style="color:#E53333;">客户端重新连接后失效。</span></strong>
</div>
<p>
	
</p>
<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/392.html" target="_blank">mysql 用户变量（@）和系统变量（@@ show variables 和 show global variables 区别）</a>
</p>
<p>
	
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/392.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>html5利用geolocation获取地区位置经纬度</title>
		<link>http://www.uuboku.com/372.html</link>
		<comments>http://www.uuboku.com/372.html#comments</comments>
		<pubDate>Mon, 28 Dec 2015 03:12:38 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[js/html/css]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=372</guid>
		<description><![CDATA[html获取用户所在地区位置经纬度 废话不多说，先贴代码出来看看 &#60;!doctype html&#62;  [...]]]></description>
			<content:encoded><![CDATA[<p>
	<a href="http://www.uuboku.com/372.html" target="_blank">html获取用户所在地区位置经纬度</a>
</p>
<p>
	
</p>
<p>
	废话不多说，先贴代码出来看看
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-html">&lt;!doctype html&gt;
&lt;html ng-app&gt;
&lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;!-- &lt;script src="http://code.angularjs.org/angular-1.0.1.min.js"&gt;&lt;/script&gt; --&gt;
    &lt;script src="./jquery.js"&gt;&lt;/script&gt;
    &lt;script&gt;var jQuery = window.jQuery = window.jQuery || $;&lt;/script&gt;
    &lt;script src="./jquery.cookie.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    Hello {{'World'}}!
    Hello {{yourname || 'World'}}!
    &lt;span id="curr_pos"&gt;&lt;/span&gt;
    &lt;span class="loc_refresh"&gt;&lt;/span&gt;
&lt;/body&gt;
&lt;script&gt;
    var app = {};
    // 获取用户地理位置
    (function($, app) {
        var watchId;
        function getLocation() {
            $('.loc_refresh').hide();
            if (navigator.geolocation) {
                $('#curr_pos').text('系统正在获取您的位置……');
                var option={
                    // 指示浏览器获取高精度的位置，默认为false
                    enableHighAcuracy: true,
                    // 指定获取地理位置的超时时间，默认不限时，单位为毫秒
                    timeout: 8000,
                };
                navigator.geolocation.getCurrentPosition(showPosition, showError,option);
                //watchId = navigator.geolocation.watchPosition(showPosition, showError,option);
            } else {
                $('#curr_pos').text('您的浏览器不支持地理定位！');
            }
        }

        function showPosition(position) {
            alert("经度 纬度 获取成功！");
            alert("经度："+position.coords.longitude+"纬度"+position.coords.latitude);
            
            return true;
            
            /******* 获取用户地理位置成功后的处理 start *********/
            //navigator.geolocation.clearWatch(watchId);
            $.ajax({
                url: 'http://www.uuboku.com/372.html?latitude=' + position.coords.latitude + '&amp;longitude=' + position.coords.longitude,
                dataType: 'json',
                success: function(data) {
                    $.cookie('is_navigator', 1,{path:'/'});
                    if (!$.cookie('navigator_address')) {
                        $('#curr_pos').text('浏览器定位失败！');
                    } else {
                        $('#curr_pos').text($.cookie('navigator_address'));
                    }
                    $('.loc_refresh').show();

                    var city = data.data.city;
                    if (city != '') {
                        if(confirm('系统定位到您在' + city +'，是否切换？')) {
                            $.ajax({
                                url: 'http://www.uuboku.com/372.html?city=' + city,
                                dataType: 'json',
                                success: function(data) {
                                    var indexReg = new RegExp('index');
                                    if(location.hash == '' || location.hash.match(indexReg)) {
                                        $("#index_v .logo a").text(city);
                                        app.util.loadFilter();
                                        location.href = '#index';
                                    }else{
                                        location.href = location.hash+"?"+Math.random();
                                    }
                                    return false;
                                } 
                            });
                        }
                    }
                    return false;
                }
            });
            /******* 获取用户地理位置成功后的处理 end *********/
        }

        function showError(error) {
            var msg = '';
            switch (error.code) {
                case error.PERMISSION_DENIED: //用户不允许地理定位
                    msg = '用户不允许地理定位！';
                    //$('#index_curr_pos').text('用户不允许地理定位');
                    break;
                case error.POSITION_UNAVAILABLE: //无法获取当前位置
                    msg = '无法获取当前位置！';
                    //navigator.geolocation.getCurrentPosition(showPosition, showError);
                    break;
                case error.TIMEOUT: //操作超时
                    msg = '操作超时！';
                    //navigator.geolocation.getCurrentPosition(showPosition, showError);
                    break;
                case error.UNKNOWN_ERROR: //未知错误
                    msg = '未知错误！';
                    break;
            }
            alert(msg);
            $('#curr_pos').text(msg);
            $('.loc_refresh').show();
        }
        app.getLocation = getLocation;

    })(jQuery, app);
    app.getLocation();
&lt;/script&gt;
&lt;/html&gt;
</pre>
<p>
	以上所有代码（包括js类库）如下，欢迎下载使用：
</p>
<p>
	<a href="http://www.uuboku.com/wp-content/uploads/2015/12/geolocation.zip" target="_blank">http://www.uuboku.com/wp-content/uploads/2015/12/geolocation.zip</a>
</p>
<p>
	
</p>
<p>
	
</p>
<p>以上代码偶已亲测，可以再移动端执行，在pc端是不可以的。贴出来与大家共学习参考！</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/372.html" target="_blank">html获取用户所在地区位置经纬度</a>
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/372.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统自带logtotate 实现日志切分</title>
		<link>http://www.uuboku.com/365.html</link>
		<comments>http://www.uuboku.com/365.html#comments</comments>
		<pubDate>Fri, 21 Aug 2015 04:51:33 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=365</guid>
		<description><![CDATA[Linux系统自带logtotate 实现日志切分 这里以nginx的日志切分为例说明 第一步：创建nginx [...]]]></description>
			<content:encoded><![CDATA[<p>
	
</p>
<h2 class="post-list-title" style="font-size:16.7999992370605px;font-weight:400;color:#555555;font-family:Verdana, Geneva, sans-serif, 微软雅黑, Tahoma, Helvetica, Arial, SimSun, sans-serif;background-color:#F6F6F6;">
	<a class="fl" href="http://www.uuboku.com/365.html">Linux系统自带logtotate 实现日志切分</a> </p>
<div class="cc" style="margin:0px;padding:0px;font-size:0px;">
	</div>
</h2>
<p>
	
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	这里以nginx的日志切分为例说明
</p>
<p>
	
</p>
<p>
	第一步：创建nginx日志切分配置文件
</p>
<p>
	<span id="more-365"></span>
</p>
<pre class="prettyprint lang-bsh">[root@gua-9-126 ~]# cd /etc/logrotate.d/
[root@gua-9-126 logrotate.d]# vim nginx</pre>
<p>
	然后写入如下配置，配置的含义有解释
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">/home/www/logs/task.access.log {
    #missingok
    #notifempty

    #执行频率 monthly/weekly/daily
    daily

    #保留X个文件
    rotate 20

    #切割后的新文件 权限和所有者/组
    create 0644 root root

    #切割后的文件按照日期命名
    dateext

    #开启日志压缩
    #compress

    #日志文件大于1M后才执行执行切割
    #minsize 1M


    #切割完成后 重启ngxin服务器
    sharedscripts
    postrotate
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript

}</pre>
<p>保存退出</p>
<p>
	
</p>
<p>
	
</p>
<p>
	2、设定crontab定时任务
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@gua-9-126 logrotate.d]# vim /etc/crontab </pre>
<p>加入如下配置</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

#nginx 日志切分 by:O(∩_∩)O  at:15.8.20
#59 23 * * * root /usr/sbin/logrotate -f /etc/logrotate.d/nginx &gt; /dev/null 2&gt;&amp;1

#调试追踪脚本 此处需要指定脚本执行账户
59 23 * * * root /usr/sbin/logrotate -vf /etc/logrotate.d/nginx &gt;&gt; /home/logs/logtotate/crontab_nginx_`date +"\%Y\%m\%d_\%H\%M\%S"`.log 2&gt;&amp;1</pre>
<p>保存退出</p>
<p>
	
</p>
<p>
	
</p>
<p>
	到此大功告成，看看验证自己的成果吧~
</p>
<p>
	
</p>
<p>
	logrotate详细介绍文档:&nbsp;http://blog.sina.com.cn/s/blog_5f54f0be0101h6y8.html
</p>
<p>
	
</p>
<p>
	
</p>
<h2 class="post-list-title" style="font-size:16.7999992370605px;font-weight:400;color:#555555;font-family:Verdana, Geneva, sans-serif, 微软雅黑, Tahoma, Helvetica, Arial, SimSun, sans-serif;background-color:#F6F6F6;">
	<a class="fl" href="http://www.uuboku.com/365.html">Linux系统自带logtotate 实现日志切分</a> </p>
<div>
		<span style="font-family:'sans serif', tahoma, verdana, helvetica;font-size:12px;line-height:1.5;"></span>
	</div>
</h2>
<p>
	
</p>
<p>
	
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/365.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mongoDB常用操作命令 终端常用操作命令</title>
		<link>http://www.uuboku.com/347.html</link>
		<comments>http://www.uuboku.com/347.html#comments</comments>
		<pubDate>Wed, 15 Jul 2015 02:27:29 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=347</guid>
		<description><![CDATA[mongoDB常用操作命令 终端常用操作命令 成功启动MongoDB后，再打开一个命令行窗口输入mongo，就 [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size:14px;font-family:Tahoma, Helvetica, Arial, 宋体, sans-serif;">
	<a href="http://www.uuboku.com/347.html" target="_blank">mongoDB常用操作命令 终端常用操作命令</a>
</p>
<p style="font-size:14px;font-family:Tahoma, Helvetica, Arial, 宋体, sans-serif;">
	
</p>
<p style="font-size:14px;font-family:Tahoma, Helvetica, Arial, 宋体, sans-serif;">
	成功启动MongoDB后，再打开一个命令行窗口输入mongo，就可以进行数据库的一些操作。输入help可以看到基本操作命令，只是MongoDB没有创建数据库的命令，
</p>
<p style="font-size:14px;font-family:Tahoma, Helvetica, Arial, 宋体, sans-serif;">
	但有类似的命令<span style="line-height:1.5;">如：如果你想创建一个“myTest”的数据库，先运行use myTest命令，之后就做一些操作（如：db.createCollection(&#8216;user&#8217;)）,这样就可以创建一个名叫“myTest”的数据库。</span>
</p>
<p>
	
</p>
<p>
	一、数据库常用命令<br />
1、Help查看命令提示
</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code74491" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	help<br />
db.help();<br />
db.yourColl.help();<br />
db.youColl.find().help();<br />
rs.help();
</div>
<p>
2、切换/创建数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code66205" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库
</div>
<p>
3、查询所有数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code44179" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	show dbs;
</div>
<p>
4、删除当前使用数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code83700" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.dropDatabase();
</div>
<p>
5、从指定主机上克隆数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code65137" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库
</div>
<p>
6、从指定的机器上复制指定数据库数据到某个数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code47383" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.copyDatabase(&#8220;mydb&#8221;, &#8220;temp&#8221;, &#8220;127.0.0.1&#8243;);将本机的mydb的数据复制到temp数据库中
</div>
<p>
7、修复当前数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code74087" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.repairDatabase();
</div>
<p>
8、查看当前使用的数据库</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code93977" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.getName();<br />
db; db和getName方法是一样的效果，都可以查询当前使用的数据库
</div>
<p>
9、显示当前db状态</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code60864" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.stats();
</div>
<p>
10、当前db版本</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code60201" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.version();
</div>
<p>
11、查看当前db的链接机器地址</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code35634" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.getMongo();
</div>
<p>
	二、Collection聚集集合<br />
1、创建一个聚集集合（table）
</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code9335" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.createCollection(“collName”, {size: 20, capped: 5, max: 100});//创建成功会显示{“ok”:1}<br />
//判断集合是否为定容量db.collName.isCapped();
</div>
<p>
2、得到指定名称的聚集集合（table）</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code61673" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.getCollection(&#8220;account&#8221;);
</div>
<p>
3、得到当前db的所有聚集集合</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code4658" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.getCollectionNames();
</div>
<p>
4、显示当前db所有聚集索引的状态</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code28820" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.printCollectionStats();
</div>
<p>
三、用户相关&nbsp;<br />
1、添加一个用户</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code56333" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.addUser(&#8220;name&#8221;);<br />
db.addUser(&#8220;userName&#8221;, &#8220;pwd123&#8243;, true); 添加用户、设置密码、是否只读
</div>
<p>
2、数据库认证、安全模式</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code20680" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.auth(&#8220;userName&#8221;, &#8220;123123&#8243;);
</div>
<p>
3、显示当前所有用户</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code54196" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	show users;
</div>
<p>
4、删除用户</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code27089" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.removeUser(&#8220;userName&#8221;);
</div>
<p>
四、聚集集合查询&nbsp;<br />
1、查询所有记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code34970" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find();<br />
相当于：select* from userInfo;
</div>
<p>
默认每页显示20条记录，当显示不下的情况下，可以用it迭代命令查询下一页数据。注意：键入it命令不能带“；”<br />
但是你可以设置每页显示数据的大小，用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。<br />
2、查询去掉后的当前聚集集合中的某列的重复数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code84768" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.distinct(&#8220;name&#8221;);<br />
会过滤掉name中的相同数据<br />
相当于：select distict name from userInfo;
</div>
<p>
3、查询age = 22的记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code61933" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({&#8220;age&#8221;: 22});<br />
相当于： select * from userInfo where age = 22;
</div>
<p>
4、查询age &gt; 22的记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code56996" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$gt: 22}});<br />
相当于：select * from userInfo where age &gt;22;
</div>
<p>
5、查询age &lt; 22的记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code45247" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$lt: 22}});<br />
相当于：select * from userInfo where age &lt;22;
</div>
<p>
6、查询age &gt;= 25的记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code80495" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$gte: 25}});<br />
相当于：select * from userInfo where age &gt;= 25;
</div>
<p>
7、查询age &lt;= 25的记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code74750" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$lte: 25}});
</div>
<p>
8、查询age &gt;= 23 并且 age &lt;= 26</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code18544" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$gte: 23, $lte: 26}});
</div>
<p>
9、查询name中包含 mongo的数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code60605" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({name: /mongo/});<br />
//相当于%%<br />
[code]select * from userInfo where name like ‘%mongo%';
</div>
<p>
10、查询name中以mongo开头的</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code7862" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({name: /^mongo/});<br />
select * from userInfo where name like ‘mongo%';
</div>
<p>
11、查询指定列name、age数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code19207" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({}, {name: 1, age: 1});<br />
相当于：select name, age from userInfo;
</div>
<p>
当然name也可以用true或false,当用ture的情况下河name:1效果一样，如果用false就是排除name，显示name以外的列信息。<br />
12、查询指定列name、age数据, age &gt; 25</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code11730" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});<br />
相当于：select name, age from userInfo where age &gt;25;
</div>
<p>
13、按照年龄排序</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code34161" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	升序：db.userInfo.find().sort({age: 1});<br />
降序：db.userInfo.find().sort({age: -1});
</div>
<p>
14、查询name = zhangsan, age = 22的数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code40311" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({name: 'zhangsan', age: 22});<br />
相当于：select * from userInfo where name = ‘zhangsan' and age = ‘22';
</div>
<p>
15、查询前5条数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code68746" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find().limit(5);<br />
相当于：selecttop 5 * from userInfo;
</div>
<p>
16、查询10条以后的数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code9999" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find().skip(10);<br />
相当于：select * from userInfo where id not in (<br />
selecttop 10 * from userInfo<br />
);
</div>
<p>
17、查询在5-10之间的数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code12798" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find().limit(10).skip(5);
</div>
<p>
可用于分页，limit是pageSize，skip是第几页*pageSize<br />
18、or与 查询</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code30957" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({$or: [{age: 22}, {age: 25}]});<br />
相当于：select * from userInfo where age = 22 or age = 25;
</div>
<p>
19、查询第一条数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code49924" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.findOne();<br />
相当于：selecttop 1 * from userInfo;<br />
db.userInfo.find().limit(1);
</div>
<p>
20、查询某个结果集的记录条数</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code39906" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({age: {$gte: 25}}).count();<br />
相当于：select count(*) from userInfo where age &gt;= 20;
</div>
<p>
21、按照某列进行排序</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code96517" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.find({sex: {$exists: true}}).count();<br />
相当于：select count(sex) from userInfo;
</div>
<p>
五、索引<br />
1、创建索引</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code26684" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.ensureIndex({name: 1});<br />
db.userInfo.ensureIndex({name: 1, ts: -1});
</div>
<p>
2、查询当前聚集集合所有索引</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code62742" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.getIndexes();
</div>
<p>
3、查看总索引记录大小</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code1453" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.userInfo.totalIndexSize();
</div>
<p>
4、读取当前集合的所有index信息</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code38434" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.reIndex();
</div>
<p>
5、删除指定索引</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code27493" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.dropIndex("name_1");
</div>
<p>
6、删除所有索引索引</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code7199" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.dropIndexes();
</div>
<p>
六、修改、添加、删除集合数据<br />
1、添加</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code68082" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.save({name: ‘zhangsan', age: 25, sex: true});
</div>
<p>
添加的数据的数据列，没有固定，根据添加的数据为准<br />
2、修改</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code85431" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);<br />
相当于：update users set name = ‘changeName' where age = 25;<br />
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);<br />
相当于：update users set age = age + 50 where name = ‘Lisi';<br />
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);<br />
相当于：update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';
</div>
<p>
3、删除</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code86500" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.remove({age: 132});
</div>
<p>
4、查询修改删除</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code83295" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.findAndModify({<br />
&nbsp;&nbsp;&nbsp; query: {age: {$gte: 25}},&nbsp;<br />
&nbsp;&nbsp;&nbsp; sort: {age: -1},&nbsp;<br />
&nbsp;&nbsp;&nbsp; update: {$set: {name: 'a2'}, $inc: {age: 2}},<br />
&nbsp;&nbsp;&nbsp; remove: true<br />
});<br />
db.runCommand({ findandmodify : "users",&nbsp;<br />
&nbsp;&nbsp;&nbsp; query: {age: {$gte: 25}},&nbsp;<br />
&nbsp;&nbsp;&nbsp; sort: {age: -1},&nbsp;<br />
&nbsp;&nbsp;&nbsp; update: {$set: {name: 'a2'}, $inc: {age: 2}},<br />
&nbsp;&nbsp;&nbsp; remove: true<br />
});
</div>
<p>
update 或 remove 其中一个是必须的参数; 其他参数可选。<br />
参数&nbsp;&nbsp;&nbsp; 详解&nbsp;&nbsp;&nbsp;&nbsp; 默认值&nbsp;<br />
query&nbsp;&nbsp;&nbsp; 查询过滤条件&nbsp;&nbsp;&nbsp; {}&nbsp;<br />
sort&nbsp;&nbsp;&nbsp; 如果多个文档符合查询过滤条件，将以该参数指定的排列方式选择出排在首位的对象，该对象将被操作&nbsp;&nbsp;&nbsp; {}&nbsp;<br />
remove&nbsp;&nbsp;&nbsp; 若为true，被选中对象将在返回前被删除&nbsp;&nbsp;&nbsp; N/A&nbsp;<br />
update&nbsp;&nbsp;&nbsp; 一个 修改器对象<br />
N/A&nbsp;<br />
new&nbsp;&nbsp;&nbsp; 若为true，将返回修改后的对象而不是原始对象。在删除操作中，该参数被忽略。&nbsp;&nbsp;&nbsp; false&nbsp;<br />
fields&nbsp;&nbsp;&nbsp; 参见Retrieving a Subset of Fields (1.5.0+)&nbsp;<br />
All fields&nbsp;<br />
upsert&nbsp;&nbsp;&nbsp; 创建新对象若查询结果为空。 示例 (1.5.4+)&nbsp;<br />
false&nbsp;<br />
七、语句块操作&nbsp;<br />
1、简单Hello World</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code92908" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	print("Hello World!");
</div>
<p>
这种写法调用了print函数，和直接写入"Hello World!"的效果是一样的；<br />
2、将一个对象转换成json</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code64069" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	tojson(new Object());<br />
tojson(new Object('a'));
</div>
<p>
3、循环添加数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code50588" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	&gt; for (var i = 0; i &lt; 30; i++) {<br />
... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});<br />
... };
</div>
<p>
这样就循环添加了30条数据，同样也可以省略括号的写法</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code64473" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	&gt; for (var i = 0; i &lt; 30; i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});
</div>
<p>
也是可以的，当你用db.users.find()查询的时候，显示多条数据而无法一页显示的情况下，可以用it查看下一页的信息；<br />
4、find 游标查询</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code22816" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	&gt;var cursor = db.users.find();<br />
&gt; while (cursor.hasNext()) {&nbsp;<br />
&nbsp;&nbsp;&nbsp; printjson(cursor.next());&nbsp;<br />
}
</div>
<p>
这样就查询所有的users信息，同样可以这样写</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code47788" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	var cursor = db.users.find();<br />
while (cursor.hasNext()) { printjson(cursor.next); }
</div>
<p>
同样可以省略{}号<br />
5、forEach迭代循环</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code46315" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.find().forEach(printjson);
</div>
<p>
forEach中必须传递一个函数来处理每条迭代的数据信息<br />
6、将find游标当数组处理</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code77291" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	var cursor = db.users.find();<br />
cursor[4];
</div>
<p>
取得下标索引为4的那条数据<br />
既然可以当做数组处理，那么就可以获得它的长度：cursor.length();或者cursor.count();<br />
那样我们也可以用循环显示数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code84363" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	for (var i = 0, len = c.length(); i &lt; len; i++) printjson(c[i]);
</div>
<p>
7、将find游标转换成数组</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code89704" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	&gt; var arr = db.users.find().toArray();<br />
&gt; printjson(arr[2]);
</div>
<p>
用toArray方法将其转换为数组<br />
8、定制我们自己的查询结果<br />
只显示age &lt;= 28的并且只显示age这列数据</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code73682" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson);<br />
db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson);
</div>
<p>
排除age的列</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code21748" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson);
</div>
<p>
9、forEach传递函数显示信息</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code50992" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.things.find({x:4}).forEach(function(x) {print(tojson(x));});
</div>
<p>
	八、其他&nbsp;<br />
1、查询之前的错误信息
</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code36702" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.getPrevError();
</div>
<p>
2、清除错误记录</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code6130" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	db.resetError();
</div>
<p>
查看聚集集合基本信息<br />
1、查看帮助&nbsp; db.yourColl.help();<br />
2、查询当前集合的数据条数&nbsp; db.yourColl.count();<br />
3、查看数据空间大小 db.userInfo.dataSize();<br />
4、得到当前聚集集合所在的db db.userInfo.getDB();<br />
5、得到当前聚集的状态 db.userInfo.stats();<br />
6、得到聚集集合总大小 db.userInfo.totalSize();<br />
7、聚集集合储存空间大小 db.userInfo.storageSize();<br />
8、Shard版本信息&nbsp; db.userInfo.getShardVersion()<br />
9、聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users<br />
10、删除当前聚集集合 db.userInfo.drop();</p>
<div class="codetitle" style="padding:0px 3px;margin:3px auto 0px;background:#F2F6FB;">
	代码如下:
</div>
<div class="codebody" id="code71287" style="border:1px solid #0099CC;padding:0px 3px 0px 5px;margin:0px auto 3px;background:#DDEDFB;">
	show dbs:显示数据库列表&nbsp;<br />
show collections：显示当前数据库中的集合（类似关系数据库中的表）&nbsp;<br />
show users：显示用户&nbsp;<br />
use &lt;db name&gt;：切换当前数据库，这和MS-SQL里面的意思一样&nbsp;<br />
db.help()：显示数据库操作命令，里面有很多的命令&nbsp;<br />
db.foo.help()：显示集合操作命令，同样有很多的命令，foo指的是当前数据库下，一个叫foo的集合，并非真正意义上的命令&nbsp;<br />
db.foo.find()：对于当前数据库中的foo集合进行数据查找（由于没有条件，会列出所有数据）&nbsp;<br />
db.foo.find( { a : 1 } )：对于当前数据库中的foo集合进行查找，条件是数据中有一个属性叫a，且a的值为1
</div>
<p>
	
</p>
<p>
	
</p>
<p>
	<span style="font-weight:normal;line-height:1.5;"><a href="http://www.uuboku.com/347.html" target="_blank">mongoDB常用操作命令 终端常用操作命令</a><br />
</span>
</p>
<p>
	
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/347.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux 修改 限制文件打开最大数 ulimit 永久生效</title>
		<link>http://www.uuboku.com/339.html</link>
		<comments>http://www.uuboku.com/339.html#comments</comments>
		<pubDate>Tue, 14 Jul 2015 10:52:36 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=339</guid>
		<description><![CDATA[linux 修改 限制文件打开最大数 ulimit 永久生效 接着上篇文章说 Linux系统默认一个进程最大打 [...]]]></description>
			<content:encoded><![CDATA[<p>
	<a href="http://www.uuboku.com/339.html" target="_blank">linux 修改 限制文件打开最大数 ulimit 永久生效</a>
</p>
<p>
	
</p>
<p>
	接着上篇文章说
</p>
<p>
	<strong>Linux系统默认一个进程最大打开文件数目是1024</strong>
</p>
<pre class="prettyprint lang-bsh">[root@cangku-16-132 log]# ulimit -n
1024
[root@cangku-16-132 log]# ulimit -n 2500
[root@cangku-16-132 log]# ulimit -n
2500</pre>
<p>像上面这种模式修改 ulimit 只能在本次打开的终端生肖，关闭该终端或者重启服务器，该配置都会失效。</p>
<p>
	
</p>
<p>
	那如何使该配置永久生肖呢？一般情况下，我们通过修改系统限制文件来彻底增大 ulimit 中 open files 的值
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@cangku-16-132 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127369
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127369
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited</pre>
<p>
	
</p>
<p>
	<span style="color:#222222;font-family:Consolas, 'Lucida Console', monospace;line-height:normal;background-color:#FFFFFF;">系统总限制是在这里，/proc/sys/fs/file-max，可以通过cat查看目前的值，修改/etc/sysctl.conf 中也可以控制。</span>
</p>
<p>
	<span style="color:#222222;font-family:Consolas, 'Lucida Console', monospace;line-height:normal;background-color:#FFFFFF;">另外还有一个，/proc/sys/fs/file-nr，可以看到整个系统目前使用的文件句柄数量。</span>
</p>
<p>
	
</p>
<p>
	<strong>方法一：直接在&nbsp;</strong><span><strong>/etc/security/limits.conf （这个文件是limits的配置文件）&nbsp;文件最后增加如下语句</strong></span>
</p>
<p>
	<span><span id="more-339"></span> </span>
</p>
<pre class="prettyprint lang-bsh">* hard nofile 2500
* soft nofile 2500</pre>
<p>
	<span>或者 </span>
</p>
<pre class="prettyprint lang-bsh">echo -ne "
* hard nofile <span>32768</span> * soft nofile <span>65536</span> "&gt;&gt; /etc/security/limits.conf</pre>
<p>
	就可以将文件句柄限制统一改成软32768、硬65536。配置文件最前面的是指domain，设置为星号代表全局，另外你也可以针对不同的用户做出不同的限制。
</p>
<p>
	<strong>注意：这个当中的硬限制是实际的限制，而软限制，是warnning限制，只会做出warning.其实ulimit命令本身就有分软硬设置，加-H就是硬，加-S就是软。（ulimit -Hn/-Sn）</strong>
</p>
<p>
	<strong>默认显示的是软限制，如果运行ulimit命令修改的时候没有加上的话，就是两个参数一起改变。</strong><strong></strong>
</p>
<p>
	<span>此法不需要重启机器，重启终端即可，可对所有账户生效。甚好！</span>
</p>
<p>
	
</p>
<p>
	<strong>方法二：此法修个的文件比较多</strong>
</p>
<p>
	第一步：vim 打开 /etc/security/limits.conf 文件，最后一行增加
</p>
<p>
	<span style="color:#337FE5;"><strong>* &#8211; nofile 2500 &nbsp;（注意：- 前后都有空格，这个表示soft 和 hard 同时修改）</strong></span>
</p>
<p>
	这句话的意思是， 系统的每一个账户默认一个进程打开文件数为2500 。&nbsp;
</p>
<p>
	* 也可以修改为单一的用户名，例如 root 或者 www 等其他系统账户
</p>
<p>
	
</p>
<p>
	第二步：vim 打开 /etc/sysctl.conf 文件，最后一行增加
</p>
<p>
	<strong><span style="color:#337FE5;">fs.file-max=2500</span></strong>
</p>
<p>
	
</p>
<p>
	第三步：重启服务器，查看修改是否生效
</p>
<p>
	
</p>
<p>
	<strong>备注：</strong><strong>如果你使用squid的话，你要在/etc/init.d/squid的文件加入ulimit -HSn 65535.另外,在squid.conf中也要加入max_filedesc 16384。</strong>
</p>
<p>
	
</p>
<p>
	参考文献：http://www.jbxue.com/LINUXjishu/1250.html<span id="__kindeditor_bookmark_start_0__"></span>
</p>
<p>
	
</p>
<p>
	<a href="http://www.uuboku.com/339.html" target="_blank">linux 修改 限制文件打开最大数 ulimit 永久生效</a>
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/339.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mongo启动WARNING: /proc/sys/vm/zone_reclaim_mode is 1</title>
		<link>http://www.uuboku.com/302.html</link>
		<comments>http://www.uuboku.com/302.html#comments</comments>
		<pubDate>Tue, 02 Sep 2014 03:09:55 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=302</guid>
		<description><![CDATA[先来一张错误图片： 从图片上明显看到&#160; Tue Sep 2 10:00:10 [initandlis [...]]]></description>
			<content:encoded><![CDATA[<p>
	先来一张错误图片：<a href="/wp-content/uploads/2014/09/20140902110851_42159.jpg"><img src="/wp-content/uploads/2014/09/20140902110851_42159.jpg" alt="" /></a>
</p>
<p>
	
</p>
<p>
	从图片上明显看到&nbsp;
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">Tue Sep  2 10:00:10 [initandlisten] ** WARNING: /proc/sys/vm/zone_reclaim_mode is 1
Tue Sep  2 10:00:10 [initandlisten] **          We suggest setting it to 0
Tue Sep  2 10:00:10 [initandlisten] **          http://www.kernel.org/doc/Documentation/sysctl/vm.txt</pre>
<p>
	启动程序报了个警告，警告的意思：建议将&nbsp;<strong>zone_reclaim_mode 设置为 0</strong>
</p>
<p>
	<span><span><strong>zone_reclaim_mode </strong>这是</span>一个内核参数，意义如下：<br />
</span>
</p>
<p>
	<span>a、当某个节点可用内存不足时：<br />
1、如果为0的话，那么系统会倾向于从其他节点分配内存<br />
2、如果为1的话，那么系统会倾向于从本地节点回收Cache内存多数时候<br />
b、Cache对性能很重要，所以0是一个更好的选择。</p>
<p></span>
</p>
<p>
	<span>这是其官方文档的介绍 &nbsp;http://www.kernel.org/doc/Documentation/sysctl/vm.txt</span>
</p>
<p>
	<span><br />
</span>
</p>
<p>
	出现这个问题一般和 &nbsp;<strong><a href="http://www.uuboku.com/212.html" target="_blank">WARNING: You are running on a NUMA machine.</a> </strong>这个警告同时报出来
</p>
<p>
	这个问题已经有文章说明了&nbsp;<a href="http://www.uuboku.com/212.html" target="_blank">http://www.uuboku.com/212.html</a>
</p>
<p>
	说的都是内核中cpu和内存分配情况
</p>
<p>
	
</p>
<p>
	【解决办法】
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@cangku-1-132 ~]# echo 0 &gt; /proc/sys/vm/zone_reclaim_mode 
[root@cangku-1-132 ~]# echo "echo 0 &gt; /proc/sys/vm/zone_reclaim_mode" &gt;&gt; /etc/rc.d/rc.local</pre>
<p>
	
</p>
<p>
	首先把 &nbsp;/proc/sys/vm/zone_reclaim_mode 的内核修改 0 ，然后把这个 &nbsp;配置项写到 &nbsp;启动程序中，<span style="line-height:1.5;">问题就得以解决了。</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<strong>顺便说下第二个红框种的问题</strong>
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">--maxConns too high, can only handle 819</pre>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@cangku-16-132 log]# ulimit -n
1024
[root@cangku-16-132 log]# ulimit -n 2500
[root@cangku-16-132 log]# ulimit -n
2500</pre>
<p>
	
</p>
<p>
	说是个问题其实也不是问题。出现这个警告是因为启动mongodb的时候，有传递一个参数maxConns:2000 &nbsp;。这个参数对于mongodb太高了，他目前只能接受819的最大连接数。
</p>
<p>
	进入mongodb查看下
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@cangku-16-132 ~]# mongo 192.168.1.132:27017/admin &nbsp;-u root -p ******
MongoDB shell version: 2.2.7
connecting to: 192.168.1.132:27017/admin
&gt; db.serverStatus().connections
{ "current" : 14, "available" : 805 }

</pre>
<p>最大连接数是 14+805&nbsp;= 819</p>
<p>
	
</p>
<p>
	<strong>其实是Linux默认进程能打开最大文件数有关，可以通过ulimit 解决</strong><strong></strong>
</p>
<p>
	
</p>
<pre class="prettyprint lang-js">ulimit -n 2500</pre>
<p>
	按照原来的参数再次启动 mongodb，这个提示没有了。
</p>
<p>
	登录mongodb，产看现在的连接数：
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">[root@cangku-16-132 rc.d]# mongo 192.168.1.132:27017/admin &nbsp;-u root -p ******
MongoDB shell version: 2.2.7
connecting to: 192.168.1.132:27017/admin
&gt; db.serverStatus().connections
{ "current" : 11, "available" : 1989 }

</pre>
<p>最大连接数已经变 11+1989=2000 了。&nbsp;</p>
<p>
	
</p>
<p>
	<strong>备注：&nbsp;</strong>
</p>
<p>
	<strong>1、修改mongodb最大连接数，在启动里边加参数 &nbsp;&#8211;maxConns=20000 或者在 /etc/mongod.cnf（mongoDB配置文件） 都可以。</strong>
</p>
<p>
	<strong>2、mongoDB最大连接数是20000。所以业界流传一段话，千万级以下的用mysql、千万级以上的用mongodb，亿级以上的用hadoop。</strong>
</p>
<p>
	<strong>3、ulimit -n 2500 这个配置只能在本次打开的终端中生效，关闭终端或者重启服务器，配置都会失效。</strong>
</p>
<p>
	<strong>要想永久生效，还请看下篇文章的讲解！</strong>
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/302.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux双网卡配置-内网网卡通过外网网卡联网</title>
		<link>http://www.uuboku.com/288.html</link>
		<comments>http://www.uuboku.com/288.html#comments</comments>
		<pubDate>Wed, 09 Jul 2014 05:45:51 +0000</pubDate>
		<dc:creator>myadmin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[首页]]></category>
		<category><![CDATA[linux双网卡配置]]></category>
		<category><![CDATA[linux网卡的数据包转发配置]]></category>
		<category><![CDATA[内网网卡通过外网网卡联网]]></category>

		<guid isPermaLink="false">http://www.uuboku.com/?p=288</guid>
		<description><![CDATA[配置双网卡网络接口eth0和eth1，并在服务器上配置NAT（网络地址转换）。 在公网ip和内部网私有ip地址 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-indent:2em;">
	配置双网卡网络接口eth0和eth1，并在服务器上配置NAT（网络地址转换）。
</p>
<p style="text-indent:2em;">
	在公网ip和内部网私有ip地址间配置静态NAT重定向数据包，使服务器成为透明网关从而使得内部网计算机可以无障碍访问外部互联网。
</p>
<p style="text-indent:2em;">
	关键词：Redhat Linux；DNS（域名解析服务器）；NAT（网络地址转换）；iptables规则
</p>
<p style="text-indent:2em;">
	
</p>
<p style="text-indent:2em;">
	假设公网IP地址为：115.218.232.116 ，对应的内网地址为：192.168.10.1</p>
<p><strong>1、打开linux数据包转发功能。</strong>
</p>
<p style="text-indent:2em;">
	出于安全考虑，Linux系统默认是禁止数据包转发的。
</p>
<p style="text-indent:2em;">
	所谓转发即当主机拥有多于一块的网卡时，其中一块收到数据包，根据数据包的目的ip地址将包发往本机另一网卡，该网卡根据路由表继续发送数据包。
</p>
<p style="text-indent:2em;">
	这通常就是路由器所要实现的功能。配置Linux系统的ip转发功能，首先保证硬件连通，然后打开系统的转发功能&nbsp;less /proc/sys/net/ipv4/ip_forward，该文件内容为0，表示禁止数据包转发，1表示允许，将其修改为1。
</p>
<p style="text-indent:2em;">
	可使用命令echo &#8220;1&#8243; &gt; /proc/sys/net/ipv4/ip_forward 修改文件内容，重启网络服务或主机后效果不再。
</p>
<p style="text-indent:2em;">
	若要其自动执行，可将命令echo &#8220;1&#8243; &gt;&nbsp;/proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者 在/etc/sysconfig/network脚本中添加 FORWARD_IPV4=&#8221;YES&#8221;
</p>
<p style="text-indent:2em;">
	命令如下：
</p>
<p style="text-indent:2em;">
	# echo &#8220;1&#8243; &gt; /proc/sys/net/ipv4/ip_forward<br />
modprobe ip_tables<br />
modprobe iptable_nat<br />
modprobe iptable_filter<br />
modprobe ip_conntrack<br />
modprobe ip_conntrack_ftp<br />
modprobe ip_nat_ftp</p>
<p><strong>2、配置防火墙</strong>
</p>
<p style="text-indent:2em;">
	在公网服务器上的iptables文件增加如下内容：</p>
<p># vi /etc/sysconfig/iptables<br />
-A POSTROUTING -s 192.168.10.2 -o eth0 -j SNAT &#8211;to-source 115.218.232.116<br />
其中192.168.10.2是需要访问外网的服务器<br />
增加完毕后，重启防火墙<br />
# service iptables restart</p>
<p>
<strong>3、将10.2服务器的网关设置为公网的内网IP地址</strong></p>
<p># vi /etc/sysconfig/network-scripts/ifcfg-eth0</p>
<p>GATEWAY=192.168.10.1</p>
<p>
<strong>4、将10.2服务器的DNS(/etc/resolv.conf)配置替换成公网的DNS配置，然后重启网络</strong></p>
<p># service network restart</p>
<p>
<strong>5、测试是否能联网</strong></p>
<p># ping -c 4 <a href="http://www.uuboku.com/288.html">www.uuboku.com</a>
</p>
<div>
	
</div>
<p style="text-indent:2em;">
	至此，linux服务器的数据包转发功能已经配置完毕了，是不是很简单，哈哈~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uuboku.com/288.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
