作者归档:邹义良

MySQL 5.7 error和warnings无具体信息显示

版本:MySQL 5.7.18 
安装方式:二进制值包解压后直接初始化
现象:只有错误代码,无错误详情,通过show errors和show warings都无法获取message。

mysql> USE ccadacdasc;
ERROR 1049 (42000): Unknown error 1049
mysql> SHOW ERRORS;
+——-+——+———-+
| Level | Code | Message  |
+——-+——+———-+
| Error | 1064 |          |
+——-+——+———-+
1 row in set (0.00 sec)
mysql> CREATE DATABASE mysql;
ERROR 1007 (HY000): Unknown error 1007
mysql> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+——-+——+———–+
| Level | Code | Message  |
+——-+——+———–+
| Note  | 3084 |          |
+——-+——+———–+
1 row in set (0.00 sec)

虽然不影响使用,也可以到文档手册去查询具体情况,但总归不方便。

检查错误日志发现:
2017-06-16T06:40:03.292520Z 0 [ERROR] Can’t find error-message file ‘/data/mysql57/bin/share/errmsg.sys’. Check error-message file location and ‘lc-messages-dir’ configuration directive.

发现errmsg.sys找不到,并且发现在bin目录中查找。

【解决方案】:

检查配置文件发现:
# grep basedir my57.cnf 
basedir = /data/mysql57/bin

basedir指定的位置有误。修改一下:
basedir = /data/mysql57

重新启动,发现无报错。
再手工产生一些error和warning,已经可以正常产生信息了。

mysql> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+——-+——+————————————————————————–+
| Level | Code | Message                                                                  |
+——-+——+————————————————————————–+
| Note  | 3084 | Replication thread(s) for channel ” are already stopped.                |
+——-+——+————————————————————————–+
1 row in set (0.00 sec)

mysql> fdsfas;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘fdsfas’ at line 1

mysql> use afdasfds;
ERROR 1049 (42000): Unknown database ‘afdasfds’

原因:该实例启动时被指定错误了basedir导致无法找到errmsg.sys,所以无法显示具体error或warning的详情。
修正my.cnf重新启动mysqld即可。

这个文件在$basedir/share中存放名在此处为:
errmsg-utf8.txt 
errmsg-utf8.txt: UTF-8 Unicode Pascal program text, with very long lines
用于存储各类error和warning的详情。

这个问题目前只存在于MySQL 5.7等更高版本的MySQL中。

在MySQL 5.6版本中,若因为指定了错误的basedir,导致无法找到errmsg.sys时,在启动时就会报错:
2017-06-16 15:02:49 11234 [ERROR] Can’t find messagefile ‘/data/mysql-base/mysql56/bin/share/errmsg.sys’

而在MySQL 5.7版本中,虽然在启动时会报错并记录在错误日志中,但mysqld仍然是可以起来的。

MAC下如何安装SASS

如何安装Sass
https://www.sass.hk

sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby。(注:mac下自带Ruby无需在安装Ruby!)

 

//1.删除原gem源
gem sources –remove https://rubygems.org/

//2.添加国内淘宝源
gem sources -a https://ruby.taobao.org/

//3.打印是否替换成功
gem sources -l

//4.更换成功后打印如下
*** CURRENT SOURCES ***
https://ruby.taobao.org/

//安装如下(如mac安装遇到权限问题需加 sudo gem install sass)
gem install sass
gem install compass

 

如果报错 You must add /O=Digital Signature Trust Co./CN=DST Root CA X3 to your local
sudo gem install -n /usr/local/bin sass
sudo gem install -n /usr/local/bin compass

php7下安装event扩展

php7下安装event扩展

有效安排I/O,时间和信号的扩展 使用可用于特定平台的最佳I/O通知机制的事件,是PHP基础设施的libevent端口。
下载地址:http://pecl.php.net/package/event

安装支持库libevent,需要编译高版本(这里以最新版本release-2.1.8-stable为例)

wget -c https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz -P /usr/local/src
cd /usr/local/src
tar -zxvf libevent-2.1.8-stable.tar.gz && cd libevent-2.1.8-stable
./configure –prefix=/usr/local/libevent-2.1.8
make && make install

 

安装event库(以event-2.3.0.tgz为例)

wget -c http://pecl.php.net/get/event-2.3.0.tgz -P /usr/local/src
cd /usr/local/src
tar -zxvf event-2.3.0.tgz && cd event-2.3.0
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –with-event-libevent-dir=/usr/local/libevent-2.1.8/
make && make install

 

在php.ini添加下面配置

extension=event.so

 

重启php-fpm后,使用php -m | grep event 查看event库插件是否安装成功

 

Ubuntu安装中文字体

1.安装fontconfig
安装命令:apt-get install fontconfig
 
2. 下载字体文件,两个文件msyh.ttf(普通)、msyhbd.ttf(加粗)或 simfang.ttf
3. 在/usr/share/fonts目录下建立一个子目录,例如win,命令如下:
    # mkdir /usr/share/fonts/myfonts
4. 将msyh.ttf和msyhbd.ttf复制到该目录下
5. 建立字体索引信息,更新字体缓存:
    # cd /usr/share/fonts/myfonts
    # mkfontscale
    # mkfontdir
    # fc-cache

    至此,字体已经安装完毕!

Linux查看已经安装的字体:

fc-list :lang=zh

 
 

AES加密时的 java.security.InvalidKeyException: Illegal key size 异常

如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. 因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美国对软件出口的控制.

处理办法: 在官方网站下载JCE无限制权限策略文件

JDK7的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
如果安装了JDK,还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

mac下,在/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib 目录

 

Intellij IDEA 使用Spring-boot-devTools无效解决办法

Intellij IDEA 使用Spring-boot-devTools无效解决办法

使用SpringBoot和thymeleaf开发web应用时,通常修改html后,比如css、javascript需要重启服务才会看到效果,spring-boot-devtools提供无需重启服务的情况下加载页面,我使用的是MacOS,intellij开发工具,下面是我在intellij中使用的步骤:

1、pom中添加spring-boot-devtools,optional表示该依赖为可选依赖。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

 

2、将工具设置为自动编译,Preferences -> Build, Execution, Deployment -> Compiler,勾选Build project automatically

3、使用快捷键shift+option+command+/,打开Registry,勾选compiler.automake.allow.when.app.running。

windows( Shift+Ctrl+Alt+/)

通过以上的设置就可以在不重启服务的情况下加载html,但如果修改java文件,服务在几秒后会自动重启,如果不希望服务重启需要在application.properties或application.yml中添加spring.devtools.reatart.enable=false

centos6 更新 libcurl

1) 创建一个新文件 /etc/yum.repos.d/city-fan.repo

2) 复制下面的到上面文件中:

[CityFan]
name=City Fan Repo
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel6/x86_64/
enabled=1
gpgcheck=0

3) 操作:

yum clean all
yum install curl

阿里云云主机添加swap分区与swap性能优化

swap的功能与相应内核参数

Linux 将物理内存分为内存段的部分被称作“页面”。交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存。物理内存和交换空间的总大小是可用的虚拟内存的总量。交换空间通常是一个磁盘分区(此分区在安装操作系统时,系统通常会默认划分出一段空间用于交换分区,默认将交换空间的大小设定为内存的1倍到2倍),也可以是一个文件。

内核参数中有一个vm.swappiness参数,此参数代表了内核对于交换空间的喜好(或厌恶)程度。Swappiness 可以有 0 到 100 的值,默认的大小通常是60,但也有的是30。设置这个参数为较低的值会减少内存的交换,从而提升一些系统上的响应度。如果内存较为充裕,则可以将vm.swappiness大小设定为30,如果内存较少,可以设定为60。如果将此数值调整的过大,可能损失内存本来能提供的性能,并增加磁盘IO消耗和CPU的消耗。

关于阿里云云主机swap功能

阿里云提供的云服务器(Elastic Compute Service,简称 ECS),是云主机的一种,当前采用的虚拟化驱动是Xen(这一点可以通过bios vendor和virtual type可以看出)。

默认情况下,阿里云云主机的swap功能是没有启用的,原因当然是通过取消swap功能可以降低磁盘IO的占用率来让用户购买更多的内存、提高磁盘寿命和性能。

阿里当前的做法是:

1.不创建swap分区,由镜像决定

2.将vm.swappiness设定为0,即永不使用swap分区

启用swap分区,确实可以降低内存的使用压力,但并不是长久之计,如果云主机上运行的应用确实需要较高的内存,建议还是购买更多的内存。

如何启用swap分区?

步骤如下:

1.查看当前系统中是否已经启用swap分区

1
2
cat /proc/swaps   
top

2.如果没有启用swap分区功能,则新建一个专门的文件用于swap分区

1
dd if=/dev/zero of=/data/swap bs=512 count=8388616

注:此文件的大小是count的大小乘以bs大小,上面命令的大小是4294971392,即4GB

3.通过mkswap命令将上面新建出的文件做成swap分区

1
mkswap /data/swap

4.查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60

1
2
3
cat /proc/sys/vm/swappiness   
sysctl -a | grep swappiness    
sysctl -w vm.swappiness=60

注:若想永久修改,则编辑/etc/sysctl.conf文件

5.启用此交换分区的交换功能

1
2
swapon /data/swap   
echo "/data/swap swap swap defaults    0  0" >> /etc/fstab

如何关闭swap分区?

1
2
swapoff /data/swap   
swapoff -a >/dev/null

关于多个交换分区在使用上的优先级    
如果你有多于一个交换文件或交换分区,你可以给它们各自分配一个优先级值(0 到 32767)。系统会在使用较低优先级的交换区域前优先使用较高优先级的交换区域。例如,如果你有一个较快的磁盘 (/dev/sda) 和一个较慢的磁盘 (/dev/sdb),给较快的设备分配一个更高的优先级。优先级可以在 fstab 中通过 pri 参数指定:    

1
2
/dev/sda1 none swap defaults,pri=100 0 0    
/dev/sdb2 none swap defaults,pri=10  0 0

或者通过 swapon 的 ?p (或者 ??priority) 参数:    

1
swapon -p 100 /dev/sda1

如果两个或更多的区域有同样的优先级,并且它们都是可用的最高优先级,页面会按照循环的方式在它们之间分配。

添加效果

PS: 原先对阿里云主机添加swap分区是否起作用表示质疑,现在看来,阿里在云主机中确实没做这方面的手脚。

image

注:关于top命令中的排序:top命令里面按下f或F,在通过箭头移动想要显示或者排序的列,按d表示显示或取消显示,按下s表示按此列排序,按下R表示翻转排序顺序。

一些可用的参考资料和扩展阅读材料:

Swap https://wiki.archlinux.org/index.php/Swap    
All about Linux swap space https://www.linux.com/news/all-about-linux-swap-space

云服务器 ECS https://www.aliyun.com/product/ecs

tag:Linux swap,阿里云添加swap交换空间,swap性能优化,云主机性能优化,云服务器性能优化

PHP开发中涉及到emoji表情的几种处理方法

PHP开发中涉及到emoji表情的几种处理方法

一般Mysql表设计时,都是用UTF8字符集的。把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串。这是怎么回事呢?

原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了。这要怎么办呢?我来介绍几种方法

1、使用utf8mb4字符集

如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集

这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,是最好的解决方案

至于字节增大带来的性能损耗,我看过一些评测,几乎是可以忽略不计的

2、使用base64编码

如果你因为某些原因无法使用utf8mb4的话,你还可以使用base64来曲线救国

使用例如base64_encode之类的函数编码过后的emoji可以直接存储在utf8字节集的数据表中,取出时decode一下放在www.itxdl.cn即可

3、干掉emoji表情

emoji表情是个麻烦的东西,即使你能存储,也不一定能完美显示。在iOS以外的平台上,例如PC或者android。如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才行。即便如此,还是可能因为emoji图片不够全而出现无法显示的情况

在大多数业务场景下,emoji也不是非要不可的。我们可以适当地考虑干掉它,节约各种成本

// 过滤掉emoji表情

function filterEmoji($str){

    $str = preg_replace_callback(

            ‘/./u’,

            function (array $match) {

                return strlen($match[0]) >= 4 ? ” : $match[0];

            },

            $str);

     return $str;

 }