show databases; (errno: 13 – Permission denied) MySQL填坑记

安全等保要求云服务器有堡垒机,防火墙,有漏洞感知,有安全防护,入口需要有负载,服务器需要有冗余,数据库需要主备…… 同时还要保留5年的所有日志(真叫人头大)。

一系列扫描,修复漏洞Fixed,然后告知在本地在弄一个容灾以及备份机。

嗯,以上是背景,有很多同学过来已经不耐烦了,妈蛋!老子遇见的是 show databases; (errno: 13 – Permission denied) 这个糟心的错误。

恩是的,这个BUG困扰了我一下午。那就梳理一下问题的几个关键点:

首先是起因:本地容灾服务器安装好了各种环境,MySQL数据库版本也统一为5.6,为了以后的日志保存500年,所以讲默认村主路径做了调整,由原来的/var/lib/mysql 调整到/data/mysql 下。然后就是修改mysql.cnf中[mysqld]下的datadir以及socket保存路径。然后就是一通操作 cp -rp /var/lib/mysql/*  /data/mysql   然后确认就是权限,文件夹下的用户属性,用户组属性。这些相比大家都应该踩过了。

然后启动mysql,接下来可能会遇到两个问题:

1.Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.

2.启动成功,登录mysql后使用show databases;的时候 出现errno: 13 – Permission denied,同时你使用 use mysql;切换数据库竟然正常。(这时候你应该有些波澜了)。

解决:首先一遍一遍的确认配置文件,文件夹权限,启动用户,然后每次启动都会都是一样的错误(假如时间超过1小时工程师会崩溃的)

然后就是把你的错误日志一遍一遍的扔进百度,得到的答案永远都是让你确认权限,文件夹属性(不知道他们真的解决了还是抄无脑转载的),然后你开始怀念Google在的日子(怀念一下被GFW封杀的ssh Proxy网站和那上万的会员。)

在无奈之后还是转向了Google,终于找到几点痕迹。

万恶的SELinux和同样坑爹的apparmor

关闭SELinux  使用 setenforce 0  然后永久关闭,修改/etc/selinux/config文件中设置SELINUX=disabled 重启。

如果是 apparmor 修改/etc/apparmor.d/usr.sbin.mysqld文件里面新增:

#这里面写新的datadir目录,写2行,一行r,一行rwk。
/data/mysql/ r,
/data/mysql/** rwk,

然后重启,填完回家。

yum 安装mysql5.7

曾经mysql落入oracle之手,原作者开创了MariaDB,此后不久各大Linux厂商纷纷转投MariaDB阵营(oracle可见多不得人心)。

随着Oracle发布mysql5.7开始支持原生json,大家又开始蠢蠢欲动了,因为之前的源都已经指向mariaDB,所以不得不采用rpm来安装,但是门槛相对傻瓜式的yum复杂一些,好在mysql提供源方便安装了

环境:centos 6.5 64bit

源地址:http://dev.mysql.com/downloads/repo/yum/

接下来不说了,继续吧

MySQL指定IP用户访问数据库

在数据库层面的安全性也尤为重要,但是往往很多人忽略了相关的设置,这里以MySQL为例

指定IP与用户访问数据库指令:

create user ‘user’@’192.168.1.100’ identified by ‘******’;
create database tdb;
grant all privileges on tdb.* to ‘user’@’192.168.1.100’ with grant option;

或者一条指令搞定

GRANT ALL PRIVILEGES ON tdb.* TO ‘user’@’192.168.1.100’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION ;

InnoDB: mmap(137363456 bytes) failed; errno 12

今天在VPS上安装MySQL5.6  :( ,内存只有512,自虐吧 哈哈哈,

然后启动报错 mysql the server quit without updating pid file,然后就被卡住了,网上一群人说的神乎其神的,后来下载了err文件逐条查看,才发现

InnoDB: mmap(137363456 bytes) failed; errno 12

Oh Shit!

于是修改my.cnf ,设置innodb_buffer_pool_size=8M

这个看说明自己配置,如果你不缺内存的话 ……

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

MySQL5.6的启动简直就是小内存杀手,自己斟酌吧 :),反正我是选择了5.5了。

然后启动MySQL,正常了,哎,其实这些异常,归根到底都是没钱惹的祸啊~~~~

MySQL开启慢查询日志

在项目开发中,我们很少回去关注性能方面的问题,但是一旦项目上线带来的问题就来了。甚至一条SQL语句也可能会酿成大祸。

前段时间在优化平台响应速度的时候优化了很多不合理的SQL语句,颇有成效,那么有时候我们也可以借助数据库提供的日志来进行针对性优化。

因为平台的关系型数据库采用的是Server version: 5.5.30-log MySQL Community Server (GPL),所以可以开启MySQL的慢查询日志。

登录MySQL,show variables like “%query%”;

查看慢查询日志是否开启:

Mysql-slow-log

其中 slow_query_log为 OFF  ,标识未开启,那么修改配置文件:vi  /etc/my.cnf

在[mysql]下面添加配置信息开启

slow_query_log=on                               #开启慢查询日志

slow_query_log_file=mysql-slow   #日志存储的文件

long_query_time=2                             #2秒钟以上的语句被记录

 

然后重启MySQL服务,进而进行下一步的优化:)

Druid 数据库连接池连接MySQL中文乱码

在更换Druid连接池前,连接URL后面添加了?useUnicode=true&characterEncoding=utf8

中文正常,在更换后出现乱码问题,于是追踪发现在Action中还是正常,在入库的时候异常了。

于是修改MySQL 配置文件。

vi /etc/my.cnf

在[client]下添加

default-character-set=utf8

[mysqld]下添加

character_set_server=utf8
init_connect= SET NAMES utf8

然后重启,乱码消失。

Linux下MySQL修改数据存储目录

今天分到虚拟机,系统盘只有20G,另外500G全部挂载到其目录下,意味着MySQL数据服务器只能修改存储。

EG:

挂载目录 /mysql/data

安装好MySQL之后登录mysql

mysql> show variables like ‘%dir%’;

查看data默认目录

datadir    | /var/lib/mysql/

关闭mysql数据库,开始修改存储路径:

chown  mysql:mysql /mysql/data

将原数据全部拷贝到新路径 cp  -a /var/lib/mysql/*  /mysql/data/

更改启动命令中的配置 vi /etc/rc.d/init.d/mysql

datadir=/mysql/data

 

重新启动MySQL,搞定。

MySQL错误:’mysql.servers’ doesn’t exist

今天升级了一下php,连同mysql-server一起升级,结果在添加新用户权限后flush时报错:

‘mysql.servers’ doesn’t exist,说表servers 不存在,这里提供一个解决方案,那就是他不存在我们就给他一个呵呵、

在mysql库里
use mysql;

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `servers` (
`Server_name` char(64) NOT NULL,
`Host` char(64) NOT NULL,
`Db` char(64) NOT NULL,
`Username` char(64) NOT NULL,
`Password` char(64) NOT NULL,
`Port` int(4) DEFAULT NULL,
`Socket` char(64) DEFAULT NULL,
`Wrapper` char(64) NOT NULL,
`Owner` char(64) NOT NULL,
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

在flush 搞定。

linux下mysql忘记密码

很多人为了防止别人破击,将密码设置的非常BT,我就是其中一个为了别人猜不出来结果导致我自己也猜不出来了,哈哈。
win下的mysql密码忘记我就不说了,太简单了这里说说在linux的服务器或者vps上忘记了的操作吧。
首先你要是能通过ssh 来登陆,那么mysql的GUI工具可以帮你解决这个问题,你可是使用SQLyogEnt的ssh 通道来完成。
如果这个不爽的话那么手动来搞定,你登陆到linux上
修改一下mysql的配置文件
vi /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi":wq"。

重新启动mysqld
/etc/init.d/mysqld restart 或者service mysqld restart
然后登陆mysql mysql -uroot 回车
修改你的新密码吧,哈哈还有修改完成后记得删除skip-grant-tables否则,哈哈
然后还有再重启一下。