【背景】

公司新启动的项目,之前因为历史原因,选择数据库版本的时候决策失误,刚开始的时候用的是mysql 5.5版本,但在上线前讨论决定统一为5.7版本;于是想把原来安装了5.5版本的服务器升级为5.7版本;具体过程是:保持5.5版本正常提供服务,然后源码编译安装5.7版本,在安装完毕启动服务测试没有问题后,导出5.5版本的数据。然后导入5.7版本,彻底没有问题后,stop5.5版本,然后将项目彻底切换到5.7版本;为了保证万无一失,先找了另外一台服务器 模拟安装,升级了一遍;在安装过程中,遇到了以下的一些问题:

【问题描述】

安装完毕后,如果先启动5.5版本,则5.7版本就启动失败; 如果把5.5版本stop;然后如果先启动5.7版本,则5.5版本就启动失败;

并且报错都是:

Starting MySQL.. ERROR! The server quit without updating PID file

【关键文件】

5.5版本:

basedir:/home/work/app/mysql_5_5_41
datadir:/home/work/app/mysql_5_5_41/data
pid-file:/home/work/app/mysql_5_5_41/data/fzsf.serverbackup.pid
socket:/tmp/mysql55.sock
config-file:/home/work/app/mysql_5_5_41/my.cnf


5.7版本:

basedir:/home/work/app/mysql_5_7_18
datadir:/home/work/app/mysql_5_7_18/data
pid-file:/home/work/app/mysql_5_7_18/data/fzsf.serverbackup.pid
socket:/tmp/mysql57.sock
config-file:/home/work/app/mysql_5_7_18/my.cnf


一直找不到问题的原因在哪里:查看err_log文件,好像提示端口号都使用了3306 ,但是我在两个不同的配置文件中.cnf使用的端口号的确是不一样的,一个是3306,一个是3307,那么是不是mysql启动加载配置文件的时候,压根就没有加载上述的两个配置文件呢?
用以下命令查看了下mysql 加载配置文件的默认顺序:


[root@fzsf bin]# ./mysql --help|grep 'my.cnf'
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /home/work/app/mysql_5_5_41/etc/my.cnf ~/.my.cnf



于是我把配置文件mv到各自的datadir/etc/my.cnf 启动时还说不行,第二天上班时,我准备将配置文件就放到basedir/my.cnf 再试试:


config-file:/home/work/app/mysql_5_5_41/my.cnf
 
config-file:/home/work/app/mysql_5_7_18/my.cnf
 
结果,还真是,问题解决了。
 
root@fzsf mysql_5_5_41]# /etc/init.d/mysqld55  start 
Starting MySQL.. SUCCESS! 
 
[root@fzsf mysql_5_5_41]# /etc/init.d/mysqld57 start 
Starting MySQL. SUCCESS!



[root@fzsf mysql_5_5_41]# ps aux | grep mysqld | grep -v grep 
root      6653  0.0  0.0 106212  1548 pts/0    S    10:26   0:00 /bin/sh /home/work/app/mysql_5_5_41/bin/mysqld_safe --datadir=/home/work/app/mysql_5_5_41/data --pid-file=/home/work/app/mysql_5_5_41/data/fzsf.serverbackup.pid
mysql     6930  0.0  0.5 485080 45376 pts/0    Sl   10:26   0:00 /home/work/app/mysql_5_5_41/bin/mysqld --basedir=/home/work/app/mysql_5_5_41 --datadir=/home/work/app/mysql_5_5_41/data --plugin-dir=/home/work/app/mysql_5_5_41/lib/plugin --user=mysql --log-error=/home/work/app/mysql_5_5_41/data/fzsf.serverbackup.err --pid-file=/home/work/app/mysql_5_5_41/data/fzsf.serverbackup.pid --socket=/tmp/mysql55.sock --port=3306


root      6965  0.0  0.0 106216  1572 pts/0    S    10:26   0:00 /bin/sh /home/work/app/mysql_5_7_18/bin/mysqld_safe --datadir=/home/work/app/mysql_5_7_18/data --pid-file=/home/work/app/mysql_5_7_18/data/fzsf.serverbackup.pid
mysql     7120  0.0  2.4 1894552 197780 pts/0  Sl   10:26   0:00 /home/work/app/mysql_5_7_18/bin/mysqld --basedir=/home/work/app/mysql_5_7_18 --datadir=/home/work/app/mysql_5_7_18/data --plugin-dir=/home/work/app/mysql_5_7_18/lib/plugin --user=mysql --log-error=/home/work/app/mysql_5_7_18/data/fzsf.serverbackup.err --pid-file=/home/work/app/mysql_5_7_18/data/fzsf.serverbackup.pid --socket=/tmp/mysql57.sock --port=3307




查看端口:


netstat -anp|grep 3306


netstat -anp|grep 3307


都监听了;



同时,如果在/etc/init.d/mysql55 或mysql57 用这脚步启动实在排查不出问题的时候,直接可以进入到各自的basedir/bin 目录后,用命令启动,类似:


mysqld_safe --defaults-file=/path/my57.cnf &



mysql 导出数据库:


mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysql 导入数据库:
登录到mysql后,执行命令: source 数据库文件路径
mysql> source /tmp/xxx.sql
查看数据库创建:
show create database dbname
CREATE DATABASE `fzsf_dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
mysql 5.5 版本修改用户密码:
update user set Password = PASSWORD('123') WHERE user = 'root';
flush privileges;
5.7及以上版本,修改密码:
update user set authentication_string = PASSWORD('test3g4ip&') WHERE user = 'root';
flush privileges;



启动数据库时,查看当前版本默认的sql_mode的值:
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+



如果需要修改mysql5.7版本默认的sql_mode的值,则需要在.cnf 文件中 显式增加sql_mode项并定义其值,如:
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
查看mysql 版本的方法:
1.在basedir/bin/下,执行mysqld -V
2.mysql>select version();
给数据库增加不同权限的账号:
项目中调用时的账号(应用和数据位于同一个机器上时:)


grant select, insert, update, delete on *.* to 'testfzsf_pro'@'localhost' identified by 'test&$ka2s';
grant select, insert, update, delete on *.* to 'testfzsf_inner'@'172.19.22.%' identified by 'test*YPvzT';


项目中调用时的账号(应用和数据位于不同一个机器上时:)
grant select, insert, update, delete on *.* to 'testfzsf_pro'@'x.x.x.x' identified by 'test&$ka2s';

grant select, insert, update, delete on *.* to 'testfzsf_inner'@'172.19.22.%' identified by 'test*YPvzT';
如果是想用mysqladmin,比如要新建一个用户用mysqladmin来备份数据库,则这个用户必须要有super权限;
如 GRANT all   ON *.* TO 'backer@'localhost'  identified by 'test*YPvzT';
消除权限:
如 revoke all privileges on *.* to 'username'@'host';



查看某个账号的权限:
show grants for yfbfzsf_pro@'localhost';
在mysql 数据库内核中 ,数据库 账号 权限的 优先级默认顺序是:
【gloal, db, table, column 四个级别】
权限问题很有意思,等有时间我会给大家一一补充说明,嘿嘿^_^