Redis 导出导入 hash 结构

导出 Redis hash 数据

方法一: 需要自己再二次处理为 reids 命令格式

echo "HGETALL miot:did:type" | redis-cli -h localhost -p 6379 >> type.raw

方法二: 导出 redis 命令格式,注意最后一行有可能输出执行时间,如果有时间就删除最后一行即可

echo "HGETALL miot:did:type" | redis-cli -h localhost -p 6379 | xargs -n 2 |awk -F" " -v KEYNAME=miot:did:type '{print "HSET "KEYNAME " " $1, "\""$2"\""}' >> type.raw

方法三: 利用 phpRedisAdmin 导出 Redis 命令格式,然后从网页端复制到文件保存

导入 Redis

  导入就简单了,将 Redis 命令文件 cat 出来,通过管道传过去即可。

cat type.raw | redis-cli -h localhost -p 6379 --pipe

Mysql开启慢查询记录耗时SQL语句

简述

  网站数据达到一定的数量级,就会有页面卡,出现50x等各种问题,mysql服务器CPU居高不下等症状。因为sql缓慢导致php缓慢,导致超时。这个时候应该先从mysql入手。就像看病一样,要先找病根,记录慢查询日志,就是观察期,观察到迹象我们就可以对症下药了。

配置参数说明

  主要靠三个参数来配置,我们用通俗的话来解释。

  1. 开关(不多说,关闭就不记录了)
    slow_query_log
  2. log存储位置(记录下来,我得知道你在哪吧,一般将它存放到mysql数据目录,也就是和你创建的数据库在同级目录)
    slow_query_log_file
  3. 超时时间 (我得让你知道多慢我忍不了)
    long_query_time

设置方法

方法一:全局变量设置

  1. 将 slow_query_log 全局变量设置为“ON”状态
    mysql> set global slow_query_log='ON'; 
  2. 设置慢查询日志存放的位置(默认在 mysql data 目录下)
    mysql> set global slow_query_log_file='slow.log';
  3. 记录超时1秒的sql语句
    mysql> set global long_query_time=1;

    注意:无需重启即可生效,但重启会失效。set global 改的参数是暂时的,想重启不变请配合修改mysql配置文件。

- 阅读全文 -

Mysql错误 Index column size too large. The maximum column size is 767 bytes

  起因:准备上线一个phphub5的项目,本地是mysql5.7,数据库是没有问题的,线上环境5.5,版本较低,导入的时候出错,现在记录一下解决过程。

[Err] 1709 - Index column size too large. The maximum column size is 767 bytes.

错误原因是因为索引的字段太长,在 stack overflow 上找到了答案。查看原地址

原来SQL:

ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

修改之后SQL:

ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;

解决方法:在 CREATE TABLE 语句后面加上 ROW_FORMAT=DYNAMIC 就可以了。

Mysql开启general_log记录

        开启general log会将所有的SQL语句记录下来。生产环境一般不会开启,因为log的量会非常庞大。但个别情况下可能会临时的开一会儿general log以供排障使用。 


* 如果是 mysql5.4以下版本

在my.ini 文件中 设置 log='你的log 日志路径'

在[mysqld]后面增加一行  然后重启mysql 生效

log=D:/wamp/www/mysql_bz.log

* 如果是 mysql5.5以上版本  一次性修改方法 重启后无效

SHOW VARIABLES LIKE '%general_log%'
SET GLOBAL general_log = 1
SET GLOBAL general_log_file = '你的log 日志路径'

长期有效修改方法在 my.ini 里面 [mysqld] 后面加上如下代码 没有 [mysqld] 自己加上

[mysqld]
general_log=ON
general_log_file=D:/wamp/logs/mysql_general.log  // 这里设置你 log日志路径

# log-raw=true  如果错误日志没记录 则开启这行,

参考地址:

http://dev.mysql.com/doc/refman/5.7/en/query-log.html

http://dev.mysql.com/doc/refman/5.7/en/password-logging.html

然后重启mysql 生效

错误的sql不会被成功解析,所以不会记录到general log中

如果需要记录所有的语句,包括那些错误的,请加 log-raw选项  log-raw=true


MySQL之Field‘***’doesn’t have a default value错误解决办法

  手上负责的一个项目在用户注册的时候会报错,找了下原因是因为字段没有默认值,我本地环境 mysql5.5 没有问题,test 环境是mysql5.6,通过查资料知道了原来跟 my.ini 的配置有关。

解决方案:

打开 my.ini,查找

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

去掉 STRICT_TRANS_TABLES, 修改为:

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

然后重启 MySQL 即可。

原理解析

  在 STRICT_TRANS_TABLES 模式 ( 严格模式 ) 下,当我们插入数据时,MySQL 会严格的进行数据的校验,当发现插入列值未满足要求,直接报 error 错误,保证了错误数据无法插入到数据库中。