<?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>爱周末 &#187; mysql</title>
	<atom:link href="http://zhoumo123.cn/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://zhoumo123.cn</link>
	<description>知识分享，共同进步。zhoumo123.cn</description>
	<lastBuildDate>Thu, 07 Nov 2019 05:53:49 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>解决The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist 问题</title>
		<link>http://zhoumo123.cn/mysql/3640.html</link>
		<comments>http://zhoumo123.cn/mysql/3640.html#comments</comments>
		<pubDate>Wed, 18 Jul 2018 03:31:05 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3640</guid>
		<description><![CDATA[Error querying database. Cause: java.sql.SQLException: The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist ### Cause: java.sql.SQLException: The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist 遇到The user specified as a definer (&#8216;r ...  <a href="http://zhoumo123.cn/mysql/3640.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>Error querying database. Cause: java.sql.SQLException: The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist<br />
### Cause: java.sql.SQLException: The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist</p>
<p>遇到The user specified as a definer (&#8216;root&#8217;@&#8217;%&#8217;) does not exist 问题，原因是没有权限，解决方法如下：<br />
<strong>1、添加访问权限</strong></p>
<p>执行SQL：<span style="color: #3366ff;">grant all privileges on *.* to root@&#8221;%&#8221; identified by &#8220;.&#8221;;</span></p>
<p><strong>2、更新权限</strong><br />
执行SQL： <span style="color: #3366ff;">flush privileges;</span></p>
<p><a href="http://zhoumo123.cn/wp-content/uploads/2018/07/sql.jpg"><img class="alignnone size-full wp-image-3641" src="http://zhoumo123.cn/wp-content/uploads/2018/07/sql.jpg" alt="sql" width="628" height="240" /></a></p>
<p>问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3640.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改my.ini导致MySQL57服务无法启动,服务没有报告任何错误 </title>
		<link>http://zhoumo123.cn/mysql/3594.html</link>
		<comments>http://zhoumo123.cn/mysql/3594.html#comments</comments>
		<pubDate>Fri, 09 Jun 2017 13:31:41 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3594</guid>
		<description><![CDATA[安装MySQL57数据库后，更改my.ini文件使数据库表实现区分大小写。在修改my.ini后导致MySQL57服务无法启动,服务没有报告任何错误 最后各种尝试发现是配置参数错误导致MySQL57服务无法启动。 查看了官方文档： Use lower_case_table_names=1 on all systems. The main disadvantage with this is that when you use SHOW TABLES or SHOW DATABASES, you do not see the names in their original lettercase. U ...  <a href="http://zhoumo123.cn/mysql/3594.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>安装MySQL57数据库后，更改my.ini文件使数据库表实现区分大小写。在修改my.ini后导致MySQL57服务无法启动,服务没有报告任何错误 最后各种尝试发现是配置参数错误导致MySQL57服务无法启动。</p>
<div id="attachment_3595" style="width: 298px" class="wp-caption alignnone"><a href="http://zhoumo123.cn/wp-content/uploads/2017/06/err.jpg"><img class="wp-image-3595 size-full" title="MySQL57服务无法启动" src="http://zhoumo123.cn/wp-content/uploads/2017/06/err.jpg" alt="MySQL57服务无法启动" width="288" height="101" /></a><p class="wp-caption-text">MySQL57服务无法启动</p></div>
<p>查看了官方文档：</p>
<p>Use<span style="color: #000000;"><strong> lower_case_table_names=1 on all systems</strong>. </span>The main disadvantage with this is that when you use SHOW TABLES or SHOW DATABASES, you do not see the names in their original lettercase.</p>
<p>Use<strong><span style="color: #000000;"> lower_case_table_names=0 on Unix</span></strong> and<strong><span style="color: #000000;"> lower_case_table_names=2 on Windows.</span></strong> This preserves the lettercase of database and table names. The disadvantage of this is that you must ensure that your statements always refer to your database and table names with the correct lettercase on Windows. If you transfer your statements to Unix, where lettercase is significant, they do not work if the lettercase is incorrect.</p>
<p>在Windows下配置<strong> lower_case_table_names=2</strong>。</p>
<p><a href="http://zhoumo123.cn/wp-content/uploads/2017/06/mysql.jpg"><img class="alignnone size-full wp-image-3596" src="http://zhoumo123.cn/wp-content/uploads/2017/06/mysql.jpg" alt="mysql" width="303" height="109" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3594.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库名和表名大写小写lower_case_table_names配置</title>
		<link>http://zhoumo123.cn/mysql/3551.html</link>
		<comments>http://zhoumo123.cn/mysql/3551.html#comments</comments>
		<pubDate>Thu, 18 Feb 2016 03:37:42 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[lower_case_table_names]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3551</guid>
		<description><![CDATA[数据库和表名在 Windows 中是大小写不敏感的 ，而在大多数类型的 Unix 系统中是大小写敏感的 Windows 版的 MySQL 默认继承 os 的大小写习惯，即使 SQL中有区分，在导入的时候都会被转为小写，如果今后再将此数据库导出就可能存在大小写的问题。my.ini 中有属性lower_case_table_names 可以更改此默认值，要严格区分大小写，将此项的置设置为2，再重启 MySQL 服务即可。 参考： [mysqld] lower_case_table_names=2 然而，该查询在Windows中是可以的。要想避免出现差别，最好采用一致的转换，例如总是用小写创建并引用 ...  <a href="http://zhoumo123.cn/mysql/3551.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>数据库和表名在 Windows 中是大小写不敏感的 ，而在大多数类型的 Unix 系统中是大小写敏感的<br />
Windows 版的 MySQL 默认继承 os 的大小写习惯，即使 SQL中有区分，在导入的时候都会被转为小写，如果今后再将此数据库导出就可能存在大小写的问题。my.ini 中有属性lower_case_table_names 可以更改此默认值，要严格区分大小写，将此项的置设置为2，再重启 MySQL 服务即可。<br />
<strong>参考：<br />
[mysqld]<br />
lower_case_table_names=2</strong></p>
<p>然而，该查询在Windows中是可以的。要想避免出现差别，最好采用一致的转换，例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换。<br />
在MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定，可以在启动mysqld 时设置。lower_case_tables_name可以采用下面的任一值：</p>
<table style="width: 98%;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="2%">值</td>
<td width="98%">含义</td>
</tr>
<tr>
<td>0</td>
<td>使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用&#8211;lower-case-table-names=0强制设为0，并且使用不同的大小写访问MyISAM表名，会导致索引破坏。</td>
</tr>
<tr>
<td>1</td>
<td>表名在硬盘上以小写保存，名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和Mac OS X系统中的默认值。</td>
</tr>
<tr>
<td>2</td>
<td>表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存，但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释： 只 在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存，例如lower_case_tables_name=1。</td>
</tr>
</tbody>
</table>
<p>http://blog.chinaunix.net/uid-26602509-id-4104999.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3551.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL存储引擎MyISAM Archive选择</title>
		<link>http://zhoumo123.cn/mysql/3542.html</link>
		<comments>http://zhoumo123.cn/mysql/3542.html#comments</comments>
		<pubDate>Mon, 15 Feb 2016 03:28:00 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL存储引擎]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3542</guid>
		<description><![CDATA[一、MySQL的存储引擎 完整的引擎说明还是看官方文档：http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 1、InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎，它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎，否则应该优先考虑InnoDB引擎。 建议使用MySQL5.5及以后的版本，因为这个版本及以后的版本的InnoDB引擎性能更好。 MySQL4.1以后的版本中，InnoDB可以将每个表的数据和索引存放在单独的文件中。这样在复制备份崩 ...  <a href="http://zhoumo123.cn/mysql/3542.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p><strong>一、MySQL的存储引擎</strong><br />
完整的引擎说明还是看官方文档：http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html<br />
这里介绍一些主要的引擎</p>
<p><strong>1、InnoDB存储引擎</strong><br />
InnoDB是MySQL的默认事务型引擎，它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎，否则应该优先考虑InnoDB引擎。</p>
<p>建议使用MySQL5.5及以后的版本，因为这个版本及以后的版本的InnoDB引擎性能更好。<br />
MySQL4.1以后的版本中，InnoDB可以将每个表的数据和索引存放在单独的文件中。这样在复制备份崩溃恢复等操作中有明显优势。可以通过在my.cnf中增加innodb_file_per_table来开启这个功能。如下：</p>
<p><span style="color: #003366;">[mysqld]</span><br />
<span style="color: #003366;"> innodb_file_per_table</span></p>
<p>InnoDB采用MVCC来支持高并发，并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读)，并且通过间隙锁(next-key locking)策略防止幻读的出现。(事务和事务隔离级别是另一个大题目，各自网补吧)。</p>
<p>InnoDB是基于聚簇索引建立的，聚簇索引对主键查询有很高的性能。不过它的二级索引(secondary index，非主键索引)中必须包含主键列，所以如果主键列很大的话，其他的所有索引都会很大。因此表上的索引较多的话，主键应当尽可能的小。</p>
<p>InnoDB的存储格式是平台独立的，可以将数据和索引文件从Intel平台复制到Sun SPARC平台或其他平台。</p>
<p>InnoDB通过一些机制和工具支持真正的热备份，MySQL的其他存储引擎不支持热备份。</p>
<p><strong>2、MyISAM存储引擎</strong><br />
MyISAM提供了大量的特性，包括全文索引、压缩、空间函数(GIS)等，但MyISAM不支持事务和行级锁，有一个毫无疑问的缺陷就是崩溃后无法安全恢复。</p>
<p>MyISAM会将表存储在两个文件在中：数据文件和索引文件，分别是.MYD和.MYI为扩展名。<br />
在MySQL5.0以前，只能处理4G的数据，5.0中可以处理256T的数据。</p>
<p>在数据不再进行修改操作时，可以对MyISAM表进行压缩，压缩后可以提高读能力，原因是减少了磁盘I/O。</p>
<p><strong>3、Archive引擎</strong><br />
Archive存储引擎只支持<strong><span style="color: #0000ff;">INSERT</span>和<span style="color: #0000ff;">SELECT</span></strong>操作，在MySQL5.1之前不支持索引。<br />
Archive表适合日志和数据采集类应用。<br />
Archive引擎支持行级锁和专用的缓存区，所以可以实现高并发的插入，但它不是一个事物型的引擎，而是一个针对高速插入和压缩做了优化的简单引擎。</p>
<p><strong>4、Blackhole引擎</strong><br />
Blackhole引擎没有实现任何存储机制，它会丢弃所有插入的数据，不做任何保存。但服务器会记录Blackhole表的日志，所以可以用于复制数据到备库，或者简单地记录到日志。但这种应用方式会碰到很多问题，因此并不推荐。</p>
<p><strong>5、CSV引擎</strong><br />
CSV引擎可以将普通的SCV文件作为MySQL的表来处理，但不支持索引。<br />
CSV引擎可以作为一种数据交换的机制，非常有用。</p>
<p><strong>6、Federated引擎</strong><br />
Federated引擎是访问其他MySQL服务器的一个代理，尽管该引擎看起来提供了一种很好的跨服务器的灵活性，但也经常带来问题，因此默认是禁用的。</p>
<p><strong>7、Memory引擎</strong><br />
如果需要快速地访问数据，并且这些数据不会被修改，重启以后丢失也没有关系，那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一个数量级。<br />
Memory表是表级锁，因此并发写入的性能较低。它不支持BLOB或TEXT类型的列，并且每行的长度是固定的，这可能呆滞部分内存的浪费。<br />
临时表和Memory表不是一回事。临时表是指使用CREATE TEMPORARY TABLE语句创建的表，它可以使用任何存储引擎，只在单个连接中可见，当连接断开时，临时表也将不复存在。</p>
<p><strong>8、NDB集群引擎</strong><br />
MySQL服务器、NDB集群存储引擎，以及分布式的、share-nothing的、容灾的、高可用的NDB数据库的组合，被称为MySQL集群(MySQL Cluster)。</p>
<p><strong>其他第三方或社区引擎</strong><br />
XtraDB：是InnoDB的一个改进版本，可以作为InnoDB的一个完美的替代产品。<br />
TokuDB：使用了一种新的叫做分形树(Fractal Trees)的索引数据结构。<br />
Infobright：是最有名的面向列的存储引擎。<br />
Groonga：是一款全文索引引擎。<br />
OQGraph：该引擎由Open Query研发，支持图操作(比如查找两点之间的最短路径)。<br />
Q4M：该引擎在MySQL内部实现了队列操作。<br />
SphinxSE：该引擎为Sphinx全文索引搜索服务器提供了SQL接口。</p>
<p><strong>二、选择合适的引擎</strong><br />
大部分情况下，InnoDB都是正确的选择，可以简单地归纳为一句话“除非需要用到某些InnoDB不具备的特性，并且没有其他办法可以替代，否则都应该优先选择InnoDB引擎”。<br />
除非万不得已，否则建议不要混合使用多种存储引擎，否则可能带来一系列负责的问题，以及一些潜在的bug和边界问题。</p>
<p>如果应用需要不同的存储引擎，请先考虑以下几个因素：</p>
<p><strong><em>事务：</em></strong><br />
如果应用需要事务支持，那么InnoDB(或者XtraDB)是目前最稳定并且经过验证的选择。</p>
<p><em><strong>备份：</strong></em><br />
如果可以定期地关闭服务器来执行备份，那么备份的因素可以忽略。反之，如果需要在线热备份，那么选择InnoDB就是基本的要求。</p>
<p><em><strong>崩溃恢复</strong></em><br />
MyISAM崩溃后发生损坏的概率比InnoDB要高很多，而且恢复速度也要慢。</p>
<p><em><strong>特有的特性</strong></em><br />
如果一个存储引擎拥有一些关键的特性，同时却又缺乏一些必要的特性，那么有时候不得不做折中的考虑，或者在架构设计上做一些取舍。</p>
<p>有些查询SQL在不同的引擎上表现不同。比较典型的是：<br />
<span style="color: #3366ff;">SELECT COUNT(*) FROM table;</span><br />
对于MyISAM确实会很快，但其他的可能都不行。</p>
<p><strong>三、应用举例</strong></p>
<p><strong>1、日志型应用</strong><br />
MyISAM或者Archive存储引擎对这类应用比较合适，因为他们开销低，而且插入速度非常快。<br />
如果需要对记录的日志做分析报表，生成报表的SQL很可能会导致插入效率明显降低，这时候该怎么办？<br />
一种解决方法，是利用MySQL内置的复制方案将数据复制一份到备库，然后在备库上执行比较消耗时间和CPU的查询。当然也可以在系统负载较低的时候执行报表查询操作，但应用在不断变化，如果依赖这个策略可能以后会导致问题。<br />
另一种方法，在日志记录表的名字中包含年和月的信息，这样可以在已经没有插入操作的历史表上做频繁的查询操作，而不会干扰到最新的当前表上的插入操作。</p>
<p><strong>2、只读或者大部分情况下只读的表</strong><br />
有些表的数据用于编制类目或者分列清单（如工作岗位），这种应用场景是典型的读多写少的业务。如果不介意MyISAM的崩溃恢复问题，选用MyISAM引擎是合适的。（MyISAM只将数据写到内存中，然后等待操作系统定期将数据刷出到磁盘上）</p>
<p><strong>3、订单处理</strong><br />
涉及订单处理，支持事务是必要的，InnoDB是订单处理类应用的最佳选择。</p>
<p><strong>4、大数据量</strong><br />
如果数据增长到10TB以上的级别，可能需要建立数据仓库。Infobright是MySQL数据仓库最成功的方案。也有一些大数据库不适合Infobright，却可能适合TokuDB。</p>
<p>http://toplchx.iteye.com/blog/1941415</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3542.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Msg] Finished &#8211; Unsuccessfully失败MySQL导入sql文件出错</title>
		<link>http://zhoumo123.cn/mysql/3537.html</link>
		<comments>http://zhoumo123.cn/mysql/3537.html#comments</comments>
		<pubDate>Fri, 29 Jan 2016 01:39:06 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3537</guid>
		<description><![CDATA[MySQL再导入sql文件时，提示 [Msg] Finished &#8211; Unsuccessfully 完成失败，导致原因为编码不正确。 解决办法： 检查SQL文件查看当前编码，将编码改为：以utf8无bom格式编码。 以下来源网络，请参考： UTF-8 不需要 BOM，尽管 Unicode 标准允许在 UTF-8 中使用 BOM。 所以不含 BOM 的 UTF-8 才是标准形式，在 UTF-8 文件中放置 BOM 主要是微软的习惯（顺便提一下：把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明，这也是微软的习惯）。 BOM（byte order mark）是 ...  <a href="http://zhoumo123.cn/mysql/3537.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>MySQL再导入sql文件时，提示 [Msg] Finished &#8211; Unsuccessfully 完成失败，导致原因为编码不正确。</p>
<p><strong>解决办法：</strong><br />
检查SQL文件查看当前编码，将编码改为：以utf8无bom格式编码。</p>
<p><a href="http://zhoumo123.cn/wp-content/uploads/2016/01/utf-8-bom.jpg"><img class="alignnone wp-image-3538 size-full" title="以utf8无bom格式编码" src="http://zhoumo123.cn/wp-content/uploads/2016/01/utf-8-bom.jpg" alt="以utf8无bom格式编码" width="305" height="262" /></a></p>
<p>以下来源网络，请参考：</p>
<p>UTF-8 不需要 BOM，尽管 Unicode 标准允许在 UTF-8 中使用 BOM。<br />
所以不含 BOM 的 UTF-8 才是标准形式，在 UTF-8 文件中放置 BOM 主要是微软的习惯（顺便提一下：把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明，这也是微软的习惯）。</p>
<p>BOM（byte order mark）是为 UTF-16 和 UTF-32 准备的，用于标记字节序（byte order）。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开，但这样的文件在 Windows 之外的操作系统里会带来问题。</p>
<p>「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。<br />
UTF-8 的网页代码不应使用 BOM，否则常常会出错。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3537.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql错误：Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217;的解决方法</title>
		<link>http://zhoumo123.cn/mysql/3502.html</link>
		<comments>http://zhoumo123.cn/mysql/3502.html#comments</comments>
		<pubDate>Tue, 12 Jan 2016 08:36:21 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3502</guid>
		<description><![CDATA[mysql 出现Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217;,一个自增字段达到了上限，而且继续向里面插入数据的话会出现 Failed to read auto-increment value from storage engine 的提示。但是今天遇到了另一个错误提示：Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217;，经过排查同样是因为自增字段达到了上限。 那为什么同一个问题会出现不同的提示呢？ 测试结果是这样的： 1、如果这个时候数据 ...  <a href="http://zhoumo123.cn/mysql/3502.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>mysql 出现Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217;,一个自增字段达到了上限，而且继续向里面插入数据的话会出现 Failed to read auto-increment value from storage engine 的提示。但是今天遇到了另一个错误提示：Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217;，经过排查同样是因为自增字段达到了上限。</p>
<p>那为什么同一个问题会出现不同的提示呢？</p>
<p>测试结果是这样的：<br />
1、如果这个时候数据表里面没有数据，而且我们用使用 INSERT INTO VALUES 这样的语句插入，就会提示 Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217; 这类的字样。</p>
<p>2、如果这个时候数据表里面没有数据，而且我们使用 INSERTINTO SELECT FROM 这样的语句插入，并且存储引擎是INNODB的话，就会提示 Failed to read auto-increment value from storage engine 这样的错误.</p>
<p>3、如果这个时候数据表里面有数据，则总是会出现Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217; 这类的字样的错误。<br />
所以，出现Duplicate entry &#8216;xxx&#8217; for key &#8216;PRIMARY&#8217; 这个时容易理解的。而另外一个提示是因为INNODB 引擎特有的二级缓存所导致的。数据不会先插入数据表，而会先存到缓存里面，只是增加表里的自增数。所以当自增数达到极限时，InnoDB要获取自增值然后存储到缓存的时候，发现找不到更高的数字了。</p>
<p>http://blog.csdn.net/topasstem8/article/details/17893197</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3502.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql查询Unknown column &#8216;xxx&#8217; in &#8216;on clause&#8217;问题解决</title>
		<link>http://zhoumo123.cn/mysql/3487.html</link>
		<comments>http://zhoumo123.cn/mysql/3487.html#comments</comments>
		<pubDate>Fri, 08 Jan 2016 08:36:26 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3487</guid>
		<description><![CDATA[mysql查询出现提示Unknown column &#8216;xxx&#8217; in &#8216;on clause&#8217;的问题原因为： MySQL5.0 Bug, 要把联合的表用括号包含起来才行: SELECT (c.id, a.id, b.id) FROM A a, B b LEFT JOIN C c ON c.a_id = a.a_id AND c.b_id = b.b_id 这句话执行应该是没有错误的,但是Mysql 5 下执行则会出错。 因为mysql下有这样一个BUG,要把联合的表用括号包含起来才行： SELECT (c.id, a.id, b.id) FROM  ...  <a href="http://zhoumo123.cn/mysql/3487.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>mysql查询出现提示Unknown column &#8216;xxx&#8217; in &#8216;on clause&#8217;的问题原因为：</p>
<p>MySQL5.0 Bug, 要把联合的表用括号包含起来才行:</p>
<p><span style="color: #3366ff;">SELECT<strong> (c.id, a.id, b.id)</strong> FROM A a, B b LEFT JOIN C c ON c.a_id = a.a_id AND c.b_id = b.b_id</span></p>
<p>这句话执行应该是没有错误的,但是Mysql 5 下执行则会出错。</p>
<p>因为mysql下有这样一个BUG,要把联合的表用括号包含起来才行：</p>
<p><span style="color: #3366ff;">SELECT<span style="color: #ff0000;"> (c.id, a.id, b.id)</span> FROM<span style="color: #ff0000;"> (A a, B b)</span> LEFT JOIN C c ON c.a_id = a.a_id AND c.b_id = b.b_id</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3487.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql返回#1114 &#8211; The table &#8216;xxxx&#8217;is full解决方法</title>
		<link>http://zhoumo123.cn/mysql/3423.html</link>
		<comments>http://zhoumo123.cn/mysql/3423.html#comments</comments>
		<pubDate>Wed, 09 Dec 2015 01:54:47 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3423</guid>
		<description><![CDATA[发现执行mysql的 REPLACE INTO 的时候mysql返回 #1114 &#8211; The table ‘xxxx’ is full 这个错误。 以前没有遇到过，于是查找资料解决这个问题。得知是由于内存表的大小超过了规定的范围，于是搜索解决方法，网上提到的有两种解决方法， 一种是修改 my-innodb-heavy-4G.ini文件里的tmp_table_size参数，然后重启mysql服务。 另外一种是修改max_heap_table_size参数。 [root@localhost etc]# vi /etc/rc.d/init.d/mysql 找到 $bindir/mysql ...  <a href="http://zhoumo123.cn/mysql/3423.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>发现执行mysql的 REPLACE INTO 的时候mysql返回 #1114 &#8211; The table ‘xxxx’ is full<br />
这个错误。</p>
<p>以前没有遇到过，于是查找资料解决这个问题。得知是由于内存表的大小超过了规定的范围，于是搜索解决方法，网上提到的有两种解决方法，</p>
<p>一种是修改 my-innodb-heavy-4G.ini文件里的tmp_table_size参数，然后重启mysql服务。</p>
<p>另外一种是修改max_heap_table_size参数。</p>
<p>[root@localhost etc]# <span style="color: #0000ff;">vi /etc/rc.d/init.d/mysql</span><br />
找到<br />
<strong>$bindir/mysqld_safe &#8211;datadir=$datadir &#8211;pid-file=$pid_file &gt;/dev/null 2&gt;&amp;1 &amp;</strong><br />
修改为<br />
<strong>$bindir/mysqld_safe &#8211;datadir=$datadir &#8211;pid-file=$pid_file -O tmp_table_size=64M -O max_heap_table_size=32M &gt;/dev/null 2&gt;&amp;1 &amp;</strong></p>
<p>重启mysql<br />
[root@localhost etc]# <span style="color: #0000ff;">/usr/bin/mysqladmin -u root -p shutdown</span><br />
Enter password:<br />
[root@localhost etc]#<span style="color: #0000ff;"> /etc/init.d/mysql start</span><br />
[root@localhost etc]#<span style="color: #0000ff;"> mysql</span></p>
<p>查看是否己修改<br />
<strong>mysql&gt; show variables like &#8216;%max_heap_table_size%';</strong><br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| Variable_name | Value |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| max_heap_table_size | 33553408 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)<br />
<strong>mysql&gt; show variables like &#8216;%tmp_table_size%';</strong><br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Variable_name | Value |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| tmp_table_size | 67108864 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)<br />
己经修改成功！</p>
<p>http://blog.sina.com.cn/s/blog_8e743a770101iwzt.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3423.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何优化Mysql千万级快速分页MySQL大数据查询分页</title>
		<link>http://zhoumo123.cn/mysql/3336.html</link>
		<comments>http://zhoumo123.cn/mysql/3336.html#comments</comments>
		<pubDate>Fri, 25 Sep 2015 13:49:42 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3336</guid>
		<description><![CDATA[MySQL数据库优化处理实现千万级快速分页分析，来看下吧。 数据表 collect ( id, title ,info ,vtype) 就这4个字段，其中 title 用定长，info 用text, id 是逐渐，vtype是tinyint，vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据，填充10万篇新闻。 最后collect 为 10万条记录，数据库表占用硬盘1.6G。OK ,看下面这条sql语句： select id,title from collect limit 1000,10; 很快；基本上0.01秒就OK，再看下面的 select id,title from ...  <a href="http://zhoumo123.cn/mysql/3336.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>MySQL数据库优化处理实现千万级快速分页分析，来看下吧。</p>
<p>数据表 collect ( id, title ,info ,vtype) 就这4个字段，其中 title 用定长，info 用text, id 是逐渐，vtype是tinyint，vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据，填充10万篇新闻。</p>
<p>最后collect 为 10万条记录，数据库表占用硬盘1.6G。OK ,看下面这条sql语句：</p>
<p>select id,title from collect limit 1000,10; 很快；基本上0.01秒就OK，再看下面的</p>
<p>select id,title from collect limit 90000,10; 从9万条开始分页，结果？</p>
<p>8-9秒完成，my god 哪出问题了？？？？其实要优化这条数据，网上找得到答案。看下面一条语句:</p>
<p>select id from collect order by id limit 90000,10; 很快，0.04秒就OK。 为什么？因为用了id主键做索引当然快。网上的改法是：</p>
<p>select id,title from collect where id&gt;=(select id from collect order by id limit 90000,1) limit 10;</p>
<p>这就是用了id做索引的结果。可是问题复杂那么一点点，就完了。看下面的语句</p>
<p>select id from collect where vtype=1 order by id limit 90000,10; 很慢，用了8-9秒！</p>
<p>到了这里我相信很多人会和我一样，有崩溃感觉！vtype 做了索引了啊？怎么会慢呢？vtype做了索引是不错，你直接 select id from collect where vtype=1 limit 1000,10; 是很快的，基本上0.05秒，可是提高90倍，从9万开始，那就是0.05*90=4.5秒的速度了。和测试结果8-9秒到了一个数量级。从这里开始有人 提出了分表的思路，这个和discuz 论坛是一样的思路。思路如下：</p>
<p>建一个索引表： t (id,title,vtype) 并设置成定长，然后做分页，分页出结果再到 collect 里面去找info 。 是否可行呢？实验下就知道了。</p>
<p>10万条记录到 t(id,title,vtype) 里，数据表大小20M左右。用</p>
<p>select id from t where vtype=1 order by id limit 90000,10; 很快了。基本上0.1-0.2秒可以跑完。为什么会这样呢？我猜想是因为collect 数据太多，所以分页要跑很长的路。limit 完全和数据表的大小有关的。其实这样做还是全表扫描，只是因为数据量小，只有10万才快。OK， 来个疯狂的实验，加到100万条，测试性能。</p>
<p>加了10倍的数据，马上t表就到了200多M，而且是定长。还是刚才的查询语句，时间是0.1-0.2秒完成！分表性能没问题？错！因为我们的limit还是9万，所以快。给个大的，90万开始</p>
<p>select id from t where vtype=1 order by id limit 900000,10; 看看结果，时间是1-2秒！</p>
<p>why ?? 分表了时间还是这么长，非常之郁闷！有人说定长会提高limit的性能，开始我也以为，因为一条记录的长度是固定的，mysql 应该可以算出90万的位置才对啊？ 可是我们高估了mysql 的智能，他不是商务数据库，事实证明定长和非定长对limit影响不大？ 怪不得有人说 discuz到了100万条记录就会很慢，我相信这是真的，这个和数据库设计有关！</p>
<p>难道MySQL 无法突破100万的限制吗？？？到了100万的分页就真的到了极限？？？</p>
<p>答案是： NO !!!! 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法，来个疯狂的测试！一张表搞定100万记录，并且10G 数据库，如何快速分页！</p>
<p>好了，我们的测试又回到 collect表，开始测试结论是： 30万数据，用分表法可行，超过30万他的速度会慢道你无法忍受！当然如果用分表+我这种方法，那是绝对完美的。但是用了我这种方法后，不用分表也可以完美解决！</p>
<p>答案就是：复合索引！ 有一次设计mysql索引的时候，无意中发现索引名字可以任取，可以选择几个字段进来，这有什么用呢？开始的select id from collect order by id limit 90000,10; 这么快就是因为走了索引，可是如果加了where 就不走索引了。抱着试试看的想法加了 search(vtype,id) 这样的索引。然后测试</p>
<p>select id from collect where vtype=1 limit 90000,10; 非常快！0.04秒完成！</p>
<p>再测试: select id ,title from collect where vtype=1 limit 90000,10; 非常遗憾，8-9秒，没走search索引！</p>
<p>再测试：search(id,vtype)，还是select id 这个语句，也非常遗憾，0.5秒。</p>
<p>综上：如果对于有where 条件，又想走索引用limit的，必须设计一个索引，将where 放第一位，limit用到的主键放第2位，而且只能select 主键！</p>
<p>完美解决了分页问题了。可以快速返回id就有希望优化limit ， 按这样的逻辑，百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的！</p>
<p>好了，回到原题，如何将上面的研究成功快速应用于开发呢？如果用复合查询，我的轻量级框架就没的用了。分页字符串还得自己写，那多麻烦？这里再看一个例子，思路就出来了：</p>
<p>select * from collect where id in (9000,12,50,7000); 竟然 0秒就可以查完！</p>
<p>mygod ，mysql 的索引竟然对于in语句同样有效！看来网上说in无法用索引是错误的！</p>
<p>有了这个结论，就可以很简单的应用于轻量级框架了：</p>
<p>代码如下：</p>
<p>$db=dblink();<br />
$db-&gt;pagesize=20;</p>
<p>$sql=&#8221;select id from collect where vtype=$vtype&#8221;;</p>
<p>$db-&gt;execute($sql);<br />
$strpage=$db-&gt;strpage(); //将分页字符串保存在临时变量，方便输出<br />
while($rs=$db-&gt;fetch_array()){<br />
$strid.=$rs[&#8216;id&#8217;].&#8217;,';<br />
}<br />
$strid=substr($strid,0,strlen($strid)-1); //构造出id字符串<br />
$db-&gt;pagesize=0; //很关键，在不注销类的情况下，将分页清空，这样只需要用一次数据库连接，不需要再开；<br />
$db-&gt;execute(&#8220;select id,title,url,sTime,gTime,vtype,tag from collect where id in ($strid)&#8221;);</p>
<p>&lt;?php while($rs=$db-&gt;fetch_array()): ?&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;id&#8217;];?&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;url&#8217;];?&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;sTime&#8217;];?&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;gTime&#8217;];?&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;vtype&#8217;];?&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;a href=&#8221;?act=show&amp;id=&lt;?php echo $rs[&#8216;id&#8217;];?&gt;&#8221; target=&#8221;_blank&#8221;&gt;&lt;?php echo $rs[&#8216;title&#8217;];?&gt;&lt;/a&gt;&lt;/td&gt;<br />
&lt;td&gt;&amp;nbsp;&lt;?php echo $rs[&#8216;tag&#8217;];?&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php endwhile; ?&gt;<br />
&lt;/table&gt;<br />
&lt;?php<br />
echo $strpage;</p>
<p>通过简单的变换，其实思路很简单：1）通过优化索引，找出id，并拼成 &#8220;123,90000,12000&#8221; 这样的字符串。2）第2次查询找出结果。</p>
<p>小小的索引+一点点的改动就使mysql 可以支持百万甚至千万级的高效分页！</p>
<p>通过这里的例子，我反思了一点：对于大型系统，PHP千万不能用框架，尤其是那种连sql语句都看不到的框架！因为开始对于我的轻量级框架都差点崩 溃！只适合小型应用的快速开发，对于ERP,OA，大型网站，数据层包括逻辑层的东西都不能用框架。如果程序员失去了对sql语句的把控，那项目的风险将 会成几何级数增加！尤其是用mysql 的时候，mysql 一定需要专业的dba 才可以发挥他的最佳性能。一个索引所造成的性能差别可能是上千倍！</p>
<p>PS: 经过实际测试，到了100万的数据，160万数据，15G表，190M索引，就算走索引，limit都得0.49秒。所以分页最好别让别人看到10万条以后的数据， 要不然会很慢！就算用索引。经过这样的优化，mysql到了百万级分页是个极限！但有这样的成绩已经很不错，如果你是用sqlserver肯定卡死！而 160万的数据用 id in (str) 很快，基本还是0秒。如果这样，千万级的数据，mysql应该也很容易应付。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3336.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql数据库错误 General error: Error writing file &#8216;/tmp/&#8230;&#8217; (Errcode: 28)</title>
		<link>http://zhoumo123.cn/mysql/3209.html</link>
		<comments>http://zhoumo123.cn/mysql/3209.html#comments</comments>
		<pubDate>Mon, 24 Aug 2015 03:49:50 +0000</pubDate>
		<dc:creator><![CDATA[zhangc]]></dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql临时文件]]></category>

		<guid isPermaLink="false">http://zhoumo123.cn/?p=3209</guid>
		<description><![CDATA[在php mysql 查询大数据时，遇到了一个错误 Fatal error: Uncaught exception &#8216;PDOException&#8217; with message &#8216;SQLSTATE[HY000]: General error: 3 Error writing file &#8216;/tmp/&#8230;&#8230;&#8217; (Errcode: 28)&#8217; in &#8230;&#8230; 。 通过搜索发现这个问题是mysql查询创建临时文件时，临时目录的空间不足导致的。 这个错误如果想看到它的现象，就必须在sql运行时来监视 ...  <a href="http://zhoumo123.cn/mysql/3209.html">  阅读全文 </a>]]></description>
				<content:encoded><![CDATA[<p>在php mysql 查询大数据时，遇到了一个错误 <b>Fatal error</b>: Uncaught exception &#8216;PDOException&#8217; with message &#8216;SQLSTATE[HY000]: General error: 3 Error writing file &#8216;/tmp/&#8230;&#8230;&#8217; (Errcode: 28)&#8217; in &#8230;&#8230; 。</p>
<p>通过搜索发现这个问题是mysql查询创建临时文件时，临时目录的空间不足导致的。</p>
<p>这个错误如果想看到它的现象，就必须在sql运行时来监视这个临时文件夹的大小，就可以看到mysql在/tmp下创建了一个临时文件，这个临时文件的大小取决于sql语句以及表的大小。</p>
<p>解决方法：配置临时文件大小</p>
<p>参考</p>
<p>http://blog.sina.com.cn/s/blog_69bd80940100n8dc.html</p>
]]></content:encoded>
			<wfw:commentRss>http://zhoumo123.cn/mysql/3209.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
