hello,大家好,我是jordy,欢迎大家一起交流学习,我的qq:1760282809,363232564 ;
【背景】
公司新启动的项目,之前因为历史原因,选择数据库版本的时候决策失误,刚开始的时候用的是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 四个级别】
权限问题很有意思,等有时间我会给大家一一补充说明,嘿嘿^_^
具体的加载顺序及流程,在持续跟踪,自测并研究中......
欢迎大家一起多多交流,我的qq:1760282809,363232564
祝大家工作愉快~