<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post/11713/</link>
<title><![CDATA[[实践OK]mysql加密存储敏感数据]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Wed, 22 Feb 2023 06:19:48 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/11713/</guid> 
<description>
<![CDATA[ 
	实践如下：<br/><textarea name="code" class="php" rows="15" cols="100">
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
Query OK, 1 row affected (0.01 sec)
use test;
Database changed
create table test( id int (12),idcard varchar (128));
Query OK, 0 rows affected (0.03 sec)
INSERT INTO test (idcard) VALUES (HEX(AES_ENCRYPT(&#039;452528199909091234&#039;,&#039;my_secret_key&#039;))) ;
Query OK, 1 row affected (0.00 sec)
SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test;
+------+--------------------+
&#124; id&nbsp;&nbsp; &#124; idcard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
+------+--------------------+
&#124; NULL &#124; 452528199909091234 &#124;
+------+--------------------+
1 row in set (0.00 sec)
select * from test&#92;G;
*************************** 1. row ***************************
&nbsp;&nbsp;&nbsp;&nbsp;id: NULL
idcard: AC89B7A39D9A5A43BF9B0B455E2097B37E7BB2A8379B6D820FB3FC97EEB197B2
1 row in set (0.00 sec)
SELECT id,LEFT(AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;),6) AS idcard FROM test;
+------+--------+
&#124; id&nbsp;&nbsp; &#124; idcard &#124;
+------+--------+
&#124; NULL &#124; 452528 &#124;
+------+--------+
1 row in set (0.00 sec)
SELECT id,CONCAT(&#039;******&#039;,LEFT(AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;),6)) AS idcard FROM test;
+------+--------------+
&#124; id&nbsp;&nbsp; &#124; idcard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
+------+--------------+
&#124; NULL &#124; ******452528 &#124;
+------+--------------+
1 row in set (0.01 sec)
SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test&nbsp;&nbsp;WHERE idcard=HEX(AES_ENCRYPT(&#039;452528199909091234&#039;,&#039;my_secret_key&#039;));
+------+--------------------+
&#124; id&nbsp;&nbsp; &#124; idcard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
+------+--------------------+
&#124; NULL &#124; 452528199909091234 &#124;
+------+--------------------+
1 row in set (0.00 sec)
SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test&nbsp;&nbsp;WHERE AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;)=&#039;452528199909091234&#039;;
+------+--------------------+
&#124; id&nbsp;&nbsp; &#124; idcard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
+------+--------------------+
&#124; NULL &#124; 452528199909091234 &#124;
+------+--------------------+
1 row in set (0.00 sec)
</textarea><br/><br/>项目中涉及到用户敏感信息，比如手机号、身份证号码等，应该以密文形式存储在数据库中，本文例子演示如何利用mysql的加解密函数对数据进行加密存储、解密读取、以及过滤查询。<br/><br/>&nbsp;&nbsp;下面以在表&quot;test&quot;中将身份证信息写入&quot;idcard&quot;字段、以及从&quot;idcard&quot;字段读取数据、以及以&quot;idcard&quot;为过滤条件进行过滤查询为例子；假设加密秘钥为&quot;my_secret_key&quot;<br/><br/>一）加密存储数据：&#039;452528199909091234&#039;，秘钥为:&#039;my_secret_key&#039;<br/>INSERT INTO test (idcard) VALUES (HEX(AES_ENCRYPT(&#039;452528199909091234&#039;,&#039;my_secret_key&#039;))) <br/><br/>二）读取并解密数据返回<br/><br/>1.读取并解密数据，数据全部返回。<br/>SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test<br/><br/>2.读取并解密数据，只返回最左边6个字符<br/>SELECT id,LEFT(AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;),6) AS idcard FROM test<br/><br/>3.读取并解密数据，只返回最左边6个字符，补充前缀&#039;******&#039;，读出来的结果为<br/>SELECT id,CONCAT(&#039;******&#039;,LEFT(AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;),6)) AS idcard FROM test<br/><br/>三）过滤查询<br/><br/>1.按照密文比较方式(要比较的数据先加密，加密后的数据和数据库里存的密文比较)<br/>SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test&nbsp;&nbsp;WHERE idcard=HEX(AES_ENCRYPT(&#039;452528199909091234&#039;,&#039;my_secret_key&#039;))<br/><br/>2.按照明文比较方式(将数据库存的密文解密出明文，然后和要比较的数据进行比较)<br/>SELECT id,AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;) AS idcard FROM test&nbsp;&nbsp;WHERE AES_DECRYPT(UNHEX(idcard),&#039;my_secret_key&#039;)=&#039;452528199909091234&#039;<br/>来自：<a href="https://blog.csdn.net/u010178611/article/details/126508465" target="_blank">https://blog.csdn.net/u010178611/article/details/126508465</a>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/10417/</link>
<title><![CDATA[[实践OK]正常关闭mysql从之正确关闭slave取消主从同步，机房迁移，原机房的从Mysql不再需要，主服务器也不存在此IP了，取消从服务器同步配置并关闭从。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Mon, 03 Feb 2020 14:29:44 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/10417/</guid> 
<description>
<![CDATA[ 
	背景：机房迁移，原机房的从Mysql不再需要，主服务器也不存在此IP了，取消从服务器同步配置并关闭从。<br/><textarea name="code" class="php" rows="15" cols="100">
stop slave;&nbsp;&nbsp;
reset slave;
change master to master_host=&#039; &#039;; 
</textarea><br/><br/><br/>mysql正确关闭slave取消主从同步<br/>mysql&gt; stop slave;&nbsp;&nbsp;<br/>Query OK, 0 rows affected (0.02 sec)<br/><br/>reset slave;<br/>change master to master_host=&#039; &#039;;&nbsp;&nbsp;#master_host=&#039; &#039; 里面必须有内容，即使为空，也应该用空格代替，而不能什么都不写。<br/><br/>实践如下：<br/><textarea name="code" class="php" rows="15" cols="100">
mysql&gt; stop slave;&nbsp;&nbsp;
Query OK, 0 rows affected (0.02 sec)

mysql&gt; reset slave;
Query OK, 0 rows affected (0.08 sec)

mysql&gt; change master to master_host=&#039; &#039;;
Query OK, 0 rows affected (0.17 sec)

mysql&gt; show slave status&#92;G;
</textarea><br/><br/>参考：https://blog.csdn.net/guoshaoliang789/article/details/86217508
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/10386/</link>
<title><![CDATA[[实践OK]InfluxDB基本安装、概念和操作]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Mon, 30 Dec 2019 08:22:14 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/10386/</guid> 
<description>
<![CDATA[ 
	yum localinstall influxdb-1.7.9.x86_64.rpm -y<br/>vim /etc/influxdb/influxdb.conf <br/><textarea name="code" class="php" rows="15" cols="100">
dir = &quot;/data/influxdb/meta&quot;
dir = &quot;/data/influxdb/data&quot;
wal-dir = &quot;/data/influxdb/wal&quot;
series-id-set-cache-size = 100
</textarea><br/>systemctl start influxdb<br/>netstat -nlpt<br/>ps -ef &#124; grep influxdb<br/>netstat -nlpt<br/><br/>influx -precision rfc3339 # connect to http://localhost:8086: Get http://localhost:8086/ping: dial tcp 127.0.0.1:8086: connect<br/>influx -precision rfc3339<br/>Connected to http://localhost:8086 version 1.7.9<br/>InfluxDB shell version: 1.7.9<br/><br/>显示数据库<br/>show databases<br/><br/>新建数据库<br/>create database jidan<br/><br/>删除数据库<br/>drop database jidan<br/><br/>使用指定数据库<br/>use jidan<br/><br/>2、InfluxDB数据表操作<br/>在InfluxDB当中，并没有表（table）这个概念，取而代之的是MEASUREMENTS，MEASUREMENTS的功能与传统数据库中的表一致，因此我们也可以将MEASUREMENTS称为InfluxDB中的表。<br/><br/>显示所有表<br/>SHOW MEASUREMENTS<br/>新建表<br/>InfluxDB中没有显式的新建表的语句，只能通过insert数据的方式来建立新表。<br/><br/>insert jidanwendu,hostname=jidanindex value=442221834240i<br/>其中 jidanwendu 就是表名，hostname是索引（tag），value=xx是记录值（field），记录值可以有多个，系统自带追加时间戳<br/>&gt; use jidan<br/>Using database jidan<br/>&gt; insert jidanwendu,hostname=jidanindex value=442221834240i<br/>&gt;多个记录值：https://www.cnblogs.com/bonelee/p/6811728.html<br/><br/>&gt; use jidan<br/>Using database jidan<br/>&gt; INSERT jidanwendu,host=serverA,region=us_west value=0.64<br/><br/>或者添加数据时，自己写入时间戳<br/>insert jidanwendu,hostname=jidanindex value=442221834240i 1435362189575692182<br/><br/><br/>删除表<br/>drop measurement jidanwendu<br/> <br/>3、数据保存策略（Retention Policies）<br/><br/>influxDB是没有提供直接删除数据记录的方法，但是提供数据保存策略，主要用于指定数据保留时间，超过指定时间，就删除这部分数据。<br/><br/>查看当前数据库Retention Policies<br/>show retention policies on &quot;db_name&quot;<br/><br/>创建新的Retention Policies<br/>create retention policy &quot;rp_name&quot; on &quot;jidan&quot; duration 3w replication 1 default<br/>rp_name：策略名；<br/>db_name：具体的数据库名；<br/>3w：保存3周，3周之前的数据将被删除，influxdb具有各种事件参数，比如：h（小时），d（天），w（星期）；<br/>replication 1：副本个数，一般为1就可以了；<br/>default：设置为默认策略<br/>修改Retention Policies<br/>alter retention policy &quot;rp_name&quot; on &quot;jidan&quot; duration 30d default<br/>删除Retention Policies<br/>drop retention policy &quot;rp_name&quot; on &quot;jidan&quot;<br/>&gt; create retention policy &quot;rp_name&quot; on &quot;jidan&quot; duration 3w replication 1 default<br/>&gt; alter retention policy &quot;rp_name&quot; on &quot;jidan&quot; duration 30d default<br/>&gt; drop retention policy &quot;rp_name&quot; on &quot;jidan&quot;<br/><br/>4、连续查询（Continuous Queries）<br/>InfluxDB的连续查询是在数据库中自动定时启动的一组语句，语句中必须包含 SELECT 关键词和 GROUP BY time() 关键词。<br/><br/>InfluxDB会将查询结果放在指定的数据表中。<br/>目的：使用连续查询是最优的降低采样率的方式，连续查询和存储策略搭配使用将会大大降低InfluxDB的系统占用量。而且使用连续查询后，数据会存放到指定的数据表中，这样就为以后统计不同精度的数据提供了方便。<br/><br/>新建连续查询<br/>CREATE CONTINUOUS QUERY &lt;cq_name&gt; ON &lt;database_name&gt;<br/>[RESAMPLE [EVERY &lt;interval&gt;] [FOR &lt;interval&gt;]]<br/>BEGIN SELECT &lt;function&gt;(&lt;stuff&gt;)[,&lt;function&gt;(&lt;stuff&gt;)] INTO &lt;different_measurement&gt;<br/>FROM &lt;current_measurement&gt; [WHERE &lt;stuff&gt;] GROUP BY time(&lt;interval&gt;)[,&lt;stuff&gt;]<br/>END<br/> 样例：<br/>CREATE CONTINUOUS QUERY rp_name ON jidan BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m) END<br/>在jidan库中新建了一个名为 wj_30m 的连续查询，每三十分钟取一个connected_clients字段的平均值、中位值、最大值、最小值 redis_clients_30m 表中。使用的数据保留策略都是 default。<br/><br/>不同database样例：<br/>CREATE CONTINUOUS QUERY rp_name ON jidan BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO jidan_30.autogen.redis_clients_30m FROM jidan.autogen.redis_clients GROUP BY ip,port,time(30m) END<br/> 实践：<br/> &gt; CREATE CONTINUOUS QUERY rp_name ON jidan BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m) END<br/>ERR: retention policy not found: jidan.rp_name&nbsp;&nbsp;#刚删了策略<br/>&gt; create retention policy &quot;rp_name&quot; on &quot;jidan&quot; duration 3w replication 1 default<br/>&gt; CREATE CONTINUOUS QUERY rp_name ON jidan BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m) END<br/><br/>显示所有已存在的连续查询<br/>SHOW CONTINUOUS QUERIES<br/><br/><br/>删除Continuous Queries<br/>DROP CONTINUOUS QUERY &lt;cq_name&gt; ON &lt;database_name&gt;<br/><br/>将influxdb中的所有的数据库都备份下来，不加任何的参数<br/>influxd backup -portable /tmp/data/total<br/><br/>更多查询条件：https://www.jianshu.com/p/a1344ca86e9b<br/>来自：https://www.cnblogs.com/shhnwangjian/p/6897216.html?utm_source=itdadao&amp;utm_medium=referral<br/>PHP调用查询：https://blog.csdn.net/weixin_41621706/article/details/100630332
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9986/</link>
<title><![CDATA[[实践OK]Centos下_MysqL5.7在使用mysqldump命令备份数据库报错：mysqldump: [Warning] Using a password on the command line interface can be insecure.]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 07 Dec 2018 16:07:11 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9986/</guid> 
<description>
<![CDATA[ 
	Centos下_MysqL5.7(Server version: 5.7.12-log)在使用mysqldump命令备份数据库报错：mysqldump: [Warning] Using a password on the command line interface can be insecure.<br/>mysql -u zabbix -p&#039;q1w2***4&#039; -P 3306 -h 127.0.0.1 -e &quot;show status like &#039;Threads_cached&#039;;&quot;&#124;grep -v Value &#124;awk &#039;&#123;print $2&#125;&#039;<br/>mysql: [Warning] Using a password on the command line interface can be insecure.<br/>3<br/><br/>===========================================================================<br/>一）Server version: 5.7.12-log Source distribution下用 2&gt;/dev/null并不行：<br/>mysql -u zabbix -*****&#039; -P 3306 -h 127.0.0.1 -e &quot;show s<br/>tatus like &#039;Threads_cached&#039;;&quot;&#124;grep -v Value &#124;awk &#039;&#123;print $2&#125;&#039; 2&gt;/dev/null<br/>mysql: [Warning] Using a password on the command line interface can be insecure.<br/>二）export MYSQL_PWD=666666 也不行。<br/><br/>最后，用如下可行方案，如下：<br/><textarea name="code" class="php" rows="15" cols="100">
cat /tmp/my.cnf 
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
host = localhost
user = zabbix
password = &#039;q1w2***4&#039;
</textarea><br/><br/>实践成功如下：<br/>mysql&nbsp;&nbsp;--defaults-extra-file=/tmp/my.cnf -e &quot;show status like &#039;Threads_cached&#039;;&quot;&#124;grep -v Value &#124;awk &#039;&#123;print $2&#125;&#039;<br/>3<br/><br/>===========================================================================<br/>以下是文章实践来源：https://www.bbsmax.com/A/nAJvbYRxJr/<br/>然后针对高版本Mysql备份数据库的解决方案来了，前方高能~~~<br/><br/>命令和以前常用的快速导入和导入命令有所不同了，需要加载我们配置的MYSQL配置文件!<br/><br/>/usr/local/mysql/bin/mysqldump --defaults-extra-file=/etc/my.cnf database &gt; /data/mysql_bak/bak_test.sql&nbsp;&nbsp;&nbsp;&nbsp;//备份导出数据库<br/>/usr/local/mysql/bin/mysql --defaults-extra-file=/etc/my.cnf database &lt; test_db.sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//导入数据库<br/>查看/data/mysql_bak下，发现想要的数据库备份文件出现了~<br/><br/>里在提到官方Url://dev.mysql.com/doc/refman/5.6/en/password-security-user.html?spm=5176.7737807.2.3.D6p7hh
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9696/</link>
<title><![CDATA[[实践OK]mysql主从复制跳过错误，跳过指定编号的错误。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 30 Mar 2018 10:45:08 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9696/</guid> 
<description>
<![CDATA[ 
	背景：辅库删除了一个用户，主库也删除了一个用户，于是出现辅库启动时候出现错误，show slave status少一个YES。<br/>错误：2018-03-30T18:41:50.906499+08:00 10 [ERROR] Slave SQL for channel &#039;&#039;: Error &#039;Can&#039;t find any matching row in the user table&#039; on query. Default database: &#039;&#039;. Query: &#039;GRANT DELETE ON *.* TO &#039;mha_rep&#039;@&#039;10.70.%&#039;&#039;, Error_code: 1133<br/>跳过一次或跳过1133都可以，如下：<br/>mysql主从复制，经常会遇到错误而导致slave端复制中断，这个时候一般就需要人工干预，跳过错误才能继续<br/>跳过错误有两种方式：<br/>1.跳过指定数量的事务：<br/>mysql&gt;slave stop;<br/>mysql&gt;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#跳过一个事务<br/>mysql&gt;slave start<br/><br/>2.修改mysql的配置文件，通过slave_skip_errors参数来跳所有错误或指定类型的错误<br/>vi /etc/my.cnf<br/>[mysqld]<br/>#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误<br/>#slave-skip-errors=all #跳过所有错误<br/><br/>来源：https://blog.csdn.net/seteor/article/details/17264633
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9681/</link>
<title><![CDATA[[实践OK]如何将Mysql从相关信息删除，清除Mysql的从信息作主使用？]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 23 Mar 2018 07:01:47 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9681/</guid> 
<description>
<![CDATA[ 
	mysql&gt; RESET SLAVE ALL ;<br/>Query OK, 0 rows affected (0.01 sec)<br/><br/>mysql&gt; show slave status&#92;G<br/>Empty set (0.00 sec)<br/><br/>摘自 ：<br/>执行reset slave;<br/>mysql&gt; stop slave;<br/>Query OK, 0 rows affected (0.04 sec)<br/><br/>mysql&gt; reset slave;<br/>Query OK, 0 rows affected (0.02 sec)<br/>在次执行会发现还是会有剩余配置信息<br/>mysql&gt; show slave status&#92;G<br/><br/>最后，<br/>执行reset slave all这个命令看看结果<br/>mysql&gt; reset slave all;<br/>Query OK, 0 rows affected (0.00 sec)<br/><br/>mysql&gt; show slave status&#92;G<br/>Empty set (0.00 sec)<br/><br/>果然没有了.reset slave执行的时候会删除master.info和relay-log.info但是同步信息会保留.要想彻底清除可以使用reset slave all.^_^,今天先到这里了.
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9534/</link>
<title><![CDATA[mysql slave relaylog名称修改后出现启动主从复制出现启动slave时，使用repository中信息初始化relay log结构失败了。为什么失败了？原来是从tjtx135-1-95-relay-bin.index文件中找不到tjtx-96-67-relay-bin.017814文件。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 24 Nov 2017 08:34:16 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9534/</guid> 
<description>
<![CDATA[ 
	今天在使用冷备份文件重做从库时遇到一个报错，值得研究一下。<br/>版本：MySQL5.6.27　<br/>一、报错现象<br/><br/>dba:(none)&gt; start slave;<br/>ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository<br/>这个时候查看error.log:<br/><br/>2017-07-17 16:19:02 9022 [ERROR] Failed to open the relay log &#039;./tjtx-96-67-relay-bin.017814&#039; (relay_log_pos 172582079).<br/>2017-07-17 16:19:02 9022 [ERROR] Could not find target log file mentioned in relay log info in the index file &#039;./tjtx135-1-95-relay-bin.index&#039; during relay log initialization.<br/>2017-07-17 16:19:02 9022 [ERROR] Failed to initialize the master info structure<br/>2017-07-17 16:19:02 9022 [Note] Check error log for additional messages. You will not be able to start replication until the issue is resolved and the server restarted.<br/>2017-07-17 16:19:02 9022 [Note] Event Scheduler: Loaded 0 events<br/>2017-07-17 16:19:02 9022 [Note] /usr/local/mysql/bin/mysqld: ready for connections.<br/>Version: &#039;5.6.27-log&#039;&nbsp;&nbsp;socket: &#039;/tmp/mysql.sock&#039;&nbsp;&nbsp;port: 3306&nbsp;&nbsp;MySQL Community Server (GPL)<br/>2017-07-17 16:19:06 9022 [ERROR] Slave SQL: Slave failed to initialize relay log info structure from the repository, Error_code: 1872<br/>从报错上看，意思是启动slave时，使用repository中信息初始化relay log结构失败了。为什么失败了？原来是从tjtx135-1-95-relay-bin.index文件中找不到tjtx-96-67-relay-bin.017814文件。到这里，答案就很清楚了，由于我使用的是冷备份文件恢复的实例，在mysql库中的slave_relay_log_info表中依然保留之前relay_log的信息，所以导致启动slave报错。<br/><br/>那如何解决呢？先来简单的了解MySQL Relay log的基础知识：<br/><br/>二、MySQL Relay log介绍<br/><br/>在MySQL复制结构下，Slave服务器会产生三种日志文件，用来保存主库的二进制日志事件以及relay log已执行到的位置和状态。<br/><br/>1、relay log 文件：由IO thread线程从主库读取的二进制日志事件组成，该日志被Slave上的SQL thread线程执行，从而实现数据的复制。<br/><br/>2、master info log：该文件保存slave连接master的状态以及配置信息，如用户名，密码，日志执行的位置等。在5.6版本之前，都是使用master.info文件，从5.6开始，通过在my.cnf&nbsp;&nbsp;中配置 --master-info-repository=TABLE。这些信息会被写入mysql.slave_master_info 表中，代替原来的master.info文件了。<br/><br/>3、relay log info log：该文件保存slave上relay log的执行位置。在5.6版本之前，都是使用relay-log.info文件，从5.6开始，通过在my.cnf中配置 --relay-log-info-repository=TABLE，使用mysql.slave_relay_log_info表代替原来的文件。每次当slave上执行start slave时，就会读取该表中的位置信息。<br/><br/>新版本使用表来代替原来的文件，主要为了crash-safe replication，从而大大提高从库的可靠性。为了保证意外情况下从库的可靠性，mysql.slave_master_info和mysql.slave_relay_log_info表必须为事务性的表，从5.6.6起，这些表默认使用InnoDB存储引擎。在5.6.5及之前的版本默认使用MyISAM引擎，可用下面语句进行转换：<br/><br/>ALTER TABLE mysql.slave_master_info ENGINE=InnoDB;<br/>ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB;<br/>【注意】不要试图手工的更新、插入、删除以上两个表的内容，以免出现意料不到的问题。<br/><br/>三、问题解决<br/><br/>通过上面的报错以及relay log介绍，很容易知道由于mysql.slave_relay_log_info表中保留了以前的复制信息，导致新从库启动时无法找到对应文件，那么我们清理掉该表中的记录不就可以了。再次提醒，不要手动删该表数据，MySQL已经提供工具给我们了：reset slave：<br/><br/>reset slave干的那些事：<br/><br/>1、删除slave_master_info ，slave_relay_log_info两个表中数据；<br/>2、删除所有relay log文件，并重新创建新的relay log文件；<br/>3、不会改变gtid_executed 或者 gtid_purged的值<br/>下面解决问题：<br/><br/><br/>dba:(none)&gt; reset slave;<br/>Query OK, 0 rows affected (0.00 sec)<br/>1<br/>dba:(none)&gt; change master to ......<br/>1<br/>2<br/>dba:(none)&gt; start slave;<br/>Query OK, 0 rows affected (0.00 sec)<br/>到这里问题解决了。<br/>来自：https://www.cnblogs.com/mysql-dba/p/7201513.html<br/>【经验】：以后用冷备份恢复实例后，在启动slave前，先进行reset slave清空下以前的旧信息。<br/><br/> 【参考资料】：https://dev.mysql.com/doc/refman/5.6/en/slave-logs.html<br/>https://dev.mysql.com/doc/refman/5.6/en/reset-slave.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9518/</link>
<title><![CDATA[[实践OK]Mysql客户端连接和PHP连接时interactive_timeout和wait_timeout的一个关系，以及在Mysql做一些超长的处理时mysql gone away的原因。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Tue, 14 Nov 2017 08:17:20 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9518/</guid> 
<description>
<![CDATA[ 
	interactive_timeout ：连接空闲超时时间。与服务器端无交互状态的连接，直到被服务器端强制关闭而等待的时间。<br/>&nbsp;&nbsp;&nbsp;&nbsp;interactive_timeout和wait_timeout意义虽然相同，但是有使用对象有本质的区别。interactive_timeout针对交互式连接（比如通过mysql客户端连接数据库），wait_timeout针对非交互式连接（比如一般在PHP中使用PDO连接数据库，当然你可以设置CLIENT_INTERACTIVE选项来改变）。所谓的交互式连接，即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。<br/>wait_timeout：连接空闲超时时间。与服务器端无交互状态的连接，直到被服务器端强制关闭而等待的时间。可以认为是服务器端连接空闲的时间，空闲超过这个时间将自动关闭。<br/><br/>交互连接：<br/>interactive_timeout 需在mysql_connect()设置CLIENT_INTERACTIVE选项后起作用，并被赋值为wait_timeout；&nbsp;&nbsp;#Mysql自己的客户端mysql命令。<br/>mysql&gt;set global wait_timeout = 60; 对当前交互链接有效； (由于mysql的BUG所有这边必须加global)<br/>mysql&gt;set global interactive_timeout = 60; 对后续起的交互链接有效；<br/><br/><br/>解决MySQL server has gone away <br/>应用程序（比如PHP）长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。 <br/>解决方案： <br/>在my.cnf文件中添加或者修改以下两个变量： <br/>wait_timeout=2880000 <br/>interactive_timeout = 2880000 <br/>关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf，则可以在连接数据库的时候设置CLIENT_INTERACTIVE，比如： <br/>sql = &quot;set interactive_timeout=24*3600&quot;; <br/>mysql_real_query(...) <br/><br/>wait_timeout过大有弊端，其体现就是MySQL里大量的SLEEP进程无法及时释放，拖累系统性能，不过也不能把这个指设置的过小，否则你可能会遭遇到“MySQL has gone away”之类的问题，通常来说，我觉得把wait_timeout设置为10是个不错的选择，但某些情况下可能也会出问题，比如说有一个CRON脚本，其中两次SQL查询的间隔时间大于10秒的话，那么这个设置就有问题了（当然，这也不是不能解决的问题，你可以在程序里时不时mysql_ping一下，以便服务器知道你还活着，重新计算wait_timeout时间）<br/><br/>本质：<br/>变量wait_timeout：服务器关闭非交互连接之前等待活动的秒数。也就是说你PHP获取一次数据后作计算了，并没有释放Mysql连接句柄，而你处理完后，继续获取数据，这个中间等待的秒数。&nbsp;&nbsp;为了防止出现这个问题，用了mysql_ping:https://mo2g.com/view/128/<br/>问题：这个秒数，DBA一般写10秒，能否突破和Mysql的Client一样，让它的值和interactive_timeout一样呢？<br/><br/>From:http://www.04007.cn/article/292.html<br/>============================================================================================<br/>总之，Mysql的原生客户端，在设置其wait_timeout的值时不受全局的设置限制，均等于全局（/etc/my.cnf）interactive_timeout的值,而PHP则并不改变全局的值，而是里面配置wait_timeout多少，此次连接就是多少，当然，也提供了类似Mysql自带客户端的参数。<br/><br/>my.cnf:<br/>interactive_timeout = 28800<br/>wait_timeout = 28800<br/><br/>mysql&gt; show variables like &#039;%timeout%&#039;;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>修改一下重新启动Mysql后，直接用Mysql客户端连接？如下：<br/>interactive_timeout = 29800<br/>wait_timeout = 28800<br/><br/>mysql<br/>mysql&gt; show variables like &#039;%timeout%&#039;;<br/><br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>而Show全局变量呢，还是显示my.cnf里设置的，但这儿会被个性的mysql在连接时作了设置而覆盖：<br/>mysql&gt; show global variables like &quot;%timeout%&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>PDO连接和Mysqlli连接结果都一样：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;$dsn = &quot;mysql:host=localhost;dbname=mysql&quot;;
&nbsp;&nbsp;$db = new PDO($dsn, &#039;root&#039;, &#039;*******&#039;);
&nbsp;&nbsp;echo&nbsp;&nbsp;&quot;show variables like &#039;%wait_timeout%&#039;&#92;n&#92;n&quot;;
&nbsp;&nbsp;$db-&gt;query(&#039;set names utf8;&#039;); //你可能会用到的utf-8,哈哈
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show variables like &#039;interactive_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show variables like &#039;wait_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;echo&nbsp;&nbsp;&quot;show global variables like &#039;%wait_timeout%&#039;&#92;n&#92;n&quot;;
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show global variables like &#039;interactive_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show global variables like &#039;wait_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
</textarea><br/><br/>Mysqlli：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;$mysqli = new mysqli(&quot;localhost&quot;, &quot;root&quot;, &quot;******&quot;, &quot;mysql&quot;);
&nbsp;&nbsp;$query=&quot;show variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;$result=$mysqli-&gt;query($query);
&nbsp;&nbsp;if ($result) &#123;
&nbsp;&nbsp;&nbsp;&nbsp; if($result-&gt;num_rows&gt;0)&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while($row =$result-&gt;fetch_array() )&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&#125;else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;查询失败&quot;;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;$result-&gt;free();
&nbsp;&nbsp;$mysqli-&gt;close();
&nbsp;&nbsp;die;
</textarea><br/>php /tmp/mysql.php<br/><br/>说明其PHP客户端并没有像mysql的命令行一样修改客户端的，而值都为配置的值：<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/><br/>PHP7不支持Mysql的mysql_connect驱动啦：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_server_name=&quot;localhost&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_username=&quot;root&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_password=&quot;*******&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_database=&quot;mysql&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$conn=mysql_connect($mysql_server_name, $mysql_username,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mysql_password);
&nbsp;&nbsp;&nbsp;&nbsp;$strsql=&quot;show variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$result=mysql_db_query($mysql_database, $strsql, $conn);
&nbsp;&nbsp;&nbsp;&nbsp;while($row=mysql_fetch_row($result))&#123;//一定要循环，指针下移。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;$strsql=&quot;show global variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$result=mysql_db_query($mysql_database, $strsql, $conn);
&nbsp;&nbsp;&nbsp;&nbsp;while($row=mysql_fetch_row($result))&#123;//一定要循环，指针下移。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;die;
</textarea><br/> Call to undefined function mysql_connect() in /tmp/mysql.php:6<br/>Stack trace:<br/>#0 &#123;main&#125;<br/>&nbsp;&nbsp;thrown in /tmp/mysql.php on line 6<br/><br/> Call to undefined function mysql_real_connect() in /tmp/mysql.php:6<br/>Stack trace:<br/>#0 &#123;main&#125;<br/>&nbsp;&nbsp;thrown in /tmp/mysql.php on line 6<br/>================================================================================<br/>mysql_connect/mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。现在PHP7已经废弃上面这两个Mysql的连接函数了。<br/>新的PDO直接用设置了，更灵活：<br/>mysql server 的配置wait_timeout如果过小，就会导致PDO出现mysql has gone away错误。<br/>解决办法，设置较长的会话超时时间。<br/>$pdo-&gt;exec(&#039;set session wait_timeout=10000&#039;);<br/>但这样一来，可能会导致更多的mysql睡眠连接。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9484/</link>
<title><![CDATA[[实践OK]The MySQL server is running with the --read-only option so it cannot execute]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Sun, 08 Oct 2017 02:47:12 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9484/</guid> 
<description>
<![CDATA[ 
	The MySQL server is running with the --read-only option so it cannot execute<br/>解决办法：<br/>mysql&gt; set global read_only=0;<br/>（关掉新主库的只读属性）<br/> flush privileges;<br/>set global read_only=1;(读写属相)<br/>flush privileges;<br/>出现：<br/>The MySQL server is running with the --read-only option so it cannot execute<br/><br/>来自：http://www.cnblogs.com/xionghui/archive/2013/03/01/2939342.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post/9462/</link>
<title><![CDATA[[实践OK]Redis低版本无法向前兼容高版本RDB文件，redis-3.0.7升级到redis-3.2.10的旧版本的dump.rdb格式无法启动问题。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Wed, 20 Sep 2017 06:56:52 +0000</pubDate> 
<guid>http://www.jackxiang.com/post/9462/</guid> 
<description>
<![CDATA[ 
	问题：redis-3.0.7升级到redis-3.2.10，之前的数据文件/data/redis/6379/dump.rdb 没有删除，service redis start会报错，如下：<br/><textarea name="code" class="php" rows="15" cols="100">
3906:M 20 Sep 14:26:55.872 # Can&#039;t handle RDB format version 8
3906:M 20 Sep 14:26:55.872 # Fatal error loading the DB: Invalid argument. Exiting.
</textarea><br/><br/>当前版本的redis无法处理version=7的RDB格式，这才明白是兼容性问题，但这种“向前兼容”一般很难做到的。<br/>解决办法：删除rdb文件/var/lib/redis/6379/dump.rdb，重启redis就行了。<br/><br/>如果能解决掉Slave没有问题，那么， 线上坏了一台Slave的Redis可以直接替换掉即可：<br/>在RPM打包发现：redis-3.0.7（线上）升级到redis-3.2.10的旧版本的dump.rdb格式无法启动如下： <br/>但是经测试可以做Slave同步，现在CentOS6和CentOS7均升级至和epll仓库一样版本redis-3.2.10。
]]>
</description>
</item>
</channel>
</rss>