欢迎光临
我们一直在努力

导入数据库时报错1067 – Invalid default value for ‘字段名’

redith阅读(345)

最近把mysql升级到5.7了,wordpress导数据报错

Invalid default value for ‘comment_date’

原因出在类似这样的语句

 `comment_date` datetime(0) NOT NULL DEFAULT '0000-00-00 00:00:00',
  `comment_date_gmt` datetime(0) NOT NULL DEFAULT '0000-00-00 00:00:00',

这种报错多是你mysql升级到5.7而引起的默认值不兼容的问题。看看你的字段名是什么,我的是时间字段,类型是datetime。想到可能是类型的默认值被限制了,查看 sql_mode。果然:NO_ZERO_IN_DATE,NO_ZERO_DATE这两个参数限制时间不能为0

查看 sql_mode

mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

临时修改:

mysql> set session
 -> sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

永久修改:

可以直接修改my.cnf文件

例如:     vim /etc/my.cnf

在[mysqld]下面添加如下列:

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

MySQL维护的常用命令大全

redith阅读(336)

最近对出现经常迁移网站,做系统的维护,主要是针对MySQL的操作,在此将近期的常用的操作命令整理一下,以便备忘。

(1)迁移数据库(下面列出相关的操作命令)

登录数据库:

mysql -uroot -p密码

导出数据:

mysqldump -h localhost -u root -p密码 数据库 –ignore-table=忽略的表 >wj.sql

还原数据:

use 数据库;

source wj.sql;

(2)bin-log日志清理

自动清理方法1:(修改配置文件和在mysql内设置参数可无需重启服务)

vim my.cnf
expire_logs_days = 7 // 表示日志保留7天,超过7天则设置为过期的

# mysql -u root -p > show binary logs; > show variables like ‘%log%’; > set global expire_logs_days = 7;

手动清理方法2:(推荐)

如果没有主从复制,可以通过下面的命令重置数据库日志,清除之前的日志文件:

reset master;

但是如果存在复制关系,应当通过 PURGE 的名来清理 bin-log 日志,语法如下:

# mysql -u root -p
> purge master logs to ‘mysql-bin.010’; //清除mysql-bin.010日志
> purge master logs before ‘2016-02-28 13:00:00’; //清除2016-02-28 13:00:00前的日志
> purge master logs before date_sub(now(), interval 3 day); //清除3天前的bin日志

注意,不要轻易手动去删除binlog,会导致binlog.index和真实存在的binlog不匹配,而导致expire_logs_day失效

(3)忘记root密码后的强制修改root密码

# /etc/init.d/mysqld stop //停止mysql服务的运行
# mysqld_safe –user=mysql –skip-grant-tables –skip-networking & //跳过受权表访问
# mysql -u root mysql //登录mysql

在mysql5.7以下的版本如下:

mysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’ and host=’127.0.0.1′ or host=’localhost’;//把空的用户密码都修改成非空的密码就行了。

在mysql5.7版本如下:

update mysql.user set authentication_string=password(‘newpassword’) where user=’root’ and host=’127.0.0.1′ or host=’localhost’;

mysql> FLUSH PRIVILEGES;
mysql> quit # /etc/init.d/mysqld restart //离开并重启mysql
# mysql -uroot -p

Enter password: <输入新设的密码newpassword>

(4)允许数据库远程连接

1、新建用户远程连接mysql数据库

grant all on *.* to admin@’%’ identified by ‘123456’ with grant option;
flush privileges;

注意admin账户不一定要存在。

2、支持root用户允许远程连接mysql数据库

grant all privileges on *.* to ‘root’@’%’ identified by ‘123456’ with grant option;
flush privileges;

wordpress在lnmp上搭建mysql自动关闭后检查脚本

redith阅读(379)

说来惭愧,有一个小站,历历数载,部分下载数据也已经丢失,近期重启后,发现部署在LNMP上面的时候,网站无故总是提示数据库连接失败,一检查,发现数据库已经停用了,换了不同版本,多台vps,仍然不见效,索性就引用了老牛写好的自动重启脚本,提供给大家参考。

脚本的大致思路如下:

1)先检测MYSQL的3306端口是否正常(第一句);
2)不正常,将检查发生错误的事件写入日志,并重启mysql。
WordPress博客写入和读取并发较大时容易出现mysql服务挂掉,以下是现用的自动重启WordPress脚本

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo “MySQL stoped at time: `date`”>> /home/wwwlogs/mysql_messages
/etc/init.d/mysql restart
sleep 15s
MYSQLPORT=`netstat -na|grep “LISTEN”|grep “3306”|awk -F[:” “]+ ‘{print $4}’`
if [ “$MYSQLPORT” == “3306” ]
then
echo “MySQL restart successful at time: `date` “>> /home/wwwlogs/mysql_messages
else
echo “MySQL restart failed at time: `date` “>> /home/wwwlogs/mysql_messages
mail -s “warn!Tuji8’s mysql restart failed” Õxzf7785@163.com
fi
else
echo “MySQL server is running”
fi

也可以用另外两个方式来监视mysql的端口

/usr/bin/nmap localhost | grep 3306

lsof -i:3306

不同的操作系统'{print $5}’处可能不一样,请各人自己测试
如果采用的第一种方式,需要安装nmap
——————————————————————————–
上述shell脚本写好后,添加执行权限和定时任务即可
添加shell脚本执行权限

chmod +x /root/mysqllisten.sh

添加定时任务(5分钟检查一次)

crontab -e

*/10 * * * * /bin/bash /root/mysqllisten.sh

service crond restart

另在网上找了个更加完善的脚本,但是我没用,也既记录下
1)先检测MYSQL的3306端口是否正常;
2)使用帐号连接数据库并执行show databases命令;
3)如以上两点都能正常工作则表示数据库运行正常,不正常则记录日志并重启,重启不成功使用Email通知管理人员。大家可以自行测试和验证,仅当作一个轮子,学以致用就好。

#!/bin/bash
#/usr/bin/nmap localhost | grep 3306
#lsof -i:3306
MYSQLPORT=`netstat -na|grep “LISTEN”|grep “3306”|awk -F[:” “]+ ‘{print $5}’`

function checkMysqlStatus(){
/usr/bin/mysql -uroot -p11111 –connect_timeout=5 -e “show databases;” &>/dev/null 2>&1
if [ $? -ne 0 ]
then
restartMysqlService
if [ “$MYSQLPORT” == “3306” ];then
echo “mysql restart successful……”
else
echo “mysql restart failure……”
echo “Server: $MYSQLIP mysql is down, please try to restart mysql by manual!” > /var/log/mysqlerr
#mail -s “WARN! server: $MYSQLIP mysql is down” admin@yourdomain.com < /var/log/mysqlerr
fi
else
echo “mysql is running…”
fi
}

function restartMysqlService(){
echo “try to restart the mysql service……”
/bin/ps aux |grep mysql |grep -v grep | awk ‘{print $2}’ | xargs kill -9
service mysql start
}

if [ “$MYSQLPORT” == “3306” ]
then
checkMysqlStatus
else
restartMysqlService
fi