背景

当我登陆博客时才发现,原来有关Python与Redis的文章浏览量那么高,令人震惊。可惜最近忙于换工作的事情没能把该系列文章写完,以后会抽时间补上。

现公司有网站从外包供应商管理维护迁移到云端自行维护的需求,网站采用MySQL(>=5.5)作为数据库后台,操作系统有从Windows切换为Linux版本的需求。因而我决定选择CentOS6.x作为服务器开发、测试与生产环境。测试环境的CentOS6.8系统搭建过程异常顺利(PS:毕竟是VW的产品,大厂出品值得信赖),但是在安装MySQL数据库管理软件phpMyAdmin时却被提醒MySQL版本过低。经查看,我使用CentOS默认源安装MySQL的版本为5.1.73,这下对网站制作方要求的MySQL版本>=5.5犯了难。

当我用尽yum update mysql* 的技巧仍然未能解决问题时候,我意识到CentOS7.x抛弃MySQL其实在6.x版本已经有了端倪,如果新版本的MySQL部署出现问题将导致测试站点无法如期搭建。看来在离职前我的DB开发的同时说我有潜质做DBA,这回真的要干DBA的活儿计了。

首先看一下yum默认源提供的mysql版本信息
[root@localhost~]# yum list | grep ^mysql
mysql-libs.x86_64 5.1.73-3.el6_5 @updates
mysql.x86_64 5.1.73-7.el6 base
mysql++.i686 3.0.9-3.el6 epel
mysql++.x86_64 3.0.9-3.el6 epel
mysql++-devel.i686 3.0.9-3.el6 epel
mysql++-devel.x86_64 3.0.9-3.el6 epel
mysql++-manuals.x86_64 3.0.9-3.el6 epel
mysql-bench.x86_64 5.1.73-7.el6 base
mysql-connector-java.noarch 1:5.1.17-6.el6 base
mysql-connector-odbc.x86_64 5.1.5r1144-7.el6 base
mysql-connector-python.noarch 1.1.6-1.el6 epel
mysql-devel.i686 5.1.73-7.el6 base
mysql-devel.x86_64 5.1.73-7.el6 base
mysql-embedded.i686 5.1.73-7.el6 base
mysql-embedded.x86_64 5.1.73-7.el6 base
mysql-embedded-devel.i686 5.1.73-7.el6 base
mysql-embedded-devel.x86_64 5.1.73-7.el6 base
mysql-libs.i686 5.1.73-7.el6 base
mysql-libs.x86_64 5.1.73-7.el6 base
mysql-mmm.noarch 2.2.1-2.el6 epel
mysql-mmm-agent.noarch 2.2.1-2.el6 epel
mysql-mmm-monitor.noarch 2.2.1-2.el6 epel
mysql-mmm-tools.noarch 2.2.1-2.el6 epel
mysql-proxy.i686 0.8.5-2.el6 epel
mysql-proxy.x86_64 0.8.5-2.el6 epel
mysql-proxy-devel.i686 0.8.5-2.el6 epel
mysql-proxy-devel.x86_64 0.8.5-2.el6 epel
mysql-server.x86_64 5.1.73-7.el6 base
mysql-test.x86_64 5.1.73-7.el6 base
mysql-utilities.noarch 1.3.6-1.el6 epel
mysqlreport.noarch 3.5-4.el6 epel
mysqltuner.noarch 1.1.1-1.el6 epel

实施

从我遇到的问题来看,很明显的是Redhat和CentOS社区在对MySQL进行封杀,但是奈何MySQL社区也不迟吃素的,他们自己出了MySQL升级方案源安装包来解决Linux厂商不支持MySQL版本的问题。

  • MySQL repository安装

下载页面
http://dev.mysql.com/downloads/repo/yum/

使用社区源安装MySQL的文档(http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

安装mysql57-community-release-el6-8.noarch.rpm 操作如下

[root@localhost Desktop]# rpm -Uvh  mysql57-community-release-el6-8.noarch.rpm 
warning: mysql57-community-release-el6-8.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...                ########################################### [100%]
   1:mysql57-community-relea########################################### [100%]
  • 查看MySQL源提供的版本信息
[root@localhost Desktop]# yum repolist all | grep mysql
mysql-connectors-community        MySQL Connectors Community      enabled:    21
mysql-connectors-community-source MySQL Connectors Community - So disabled
mysql-tools-community             MySQL Tools Community           enabled:    38
mysql-tools-community-source      MySQL Tools Community - Source  disabled
mysql-tools-preview               MySQL Tools Preview             disabled
mysql-tools-preview-source        MySQL Tools Preview - Source    disabled
mysql55-community                 MySQL 5.5 Community Server      disabled
mysql55-community-source          MySQL 5.5 Community Server - So disabled
mysql56-community                 MySQL 5.6 Community Server      disabled
mysql56-community-source          MySQL 5.6 Community Server - So disabled
mysql57-community                 MySQL 5.7 Community Server      enabled:   114
mysql57-community-source          MySQL 5.7 Community Server - So disabled

从列表可以看SQL 5.5、5.6、5.7都可以安装,大功告成就在眼前,本宝宝好激动。

  • 既然成功就在眼前那么就赶快直接install
    Install MySQL by the following command (for dnf-enabled systems, replace yum in the command with dnf):
yum install mysql-community-server

duang,MySQL5.7功!

  • MySQL5.7密码问题

与之前MySQL默认密码为空不同,MySQL5.7采取了默认在安装完成生成随机登陆密码,保存在 .mysql_secret中,我忽略了安装时的目录,因而找不到该文件,也就无法登陆有密码的MySQL5.7的root用户。那么只有暴力重置能完美解决。

修改MySQL的配置文件(默认为/etc/my.cnf),在[mysqld]下添加一行

skip-grant-tables

保存配置文件后,重启MySQL

service mysqld restart

再次进入MySQL命令行 mysql -uroot -p,输入密码时直接回车,就会进入MySQL数据库了,这个时候按修改root密码即可。

mysql -u root mysql

MySQL 5.6及以之前版本

mysql> UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root';
Query OK, 0 rows affected (0.00 sec) c)
mysql> FLUSH PRIVILES;

MySQL 5.7

mysql> UPDATE user SET authentication_string = password ( 'new-password' ) WHERE User = 'root' ;
Query OK, 0 rows affected (0.00 sec) 
mysql> FLUSH PRIVILES;

注意表mysql.user密码column名称由原来的Password更改为了Authenticatistring

  • phpMyAdmin无法登陆
    当安装完成后phpMyAdmin依然无法登陆,问题就出在MySQL默认用户表mysql.user登陆密码列名称由原来的Password更改为了Authentication_string,这下好了MySQL5.7的麻烦事当下phpMyAdmin版本无法解决的,唯一的方案就是MySQL版本回退到5.6或者5.5.5。
  • 查看可以安装的MySQl版本
[root@localhost HBU]# yum repolist enabled | grep mysql
mysql-connectors-community           MySQL Connectors Community              21
mysql-tools-community                MySQL Tools Community                   38
mysql56-community                    MySQL 5.6 Community Server             282
  • 修改MySQl版本源文件指定5.6版本

安装MySQL社区官网文档操作,编辑 /etc/yum.repos.d/mysql-community.repo,修改mysql57配置中的enabled=0,设置mysql56的enabled=1。

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

Find the entry for the subrepository you want to configure, and edit the enabled option. Specify enabled=0 to disable a subrepository, orenabled=1 to enable a subrepository. For example, to install MySQl 5.6, make sure you have enabled=0 for the above subrepository entry for MySQL 5.7, and have enabled=1 for the entry for the 5.6 series:

Enable to use MySQL5.6

[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
  • 安装MySQL5.6

参照前述安装步骤直接安装即可,其中MySQL5.6初始化中支持root免密登陆。

思路

1、软件安装遇到版本问题不可怕,可怕的是找不到切入点。在默认源版本过低时我们可以选择tar.gz编译安装,但是编译安装的方便性远没有rpm包安装快捷,当需要快速部署环境而不是软件调优时,采用成熟安装包能够快速实现目标。

2、phpMyAdmin无法有效支持登陆并管理MySQL5.7在修改密码时遇到的column名字变化是一个先验征兆。但是我们仍然需要查看phpMyAdmin源码来证实改推断,当从源码角度判断出修改phpMyAdmin的登陆方式依赖column名称时,就会从MySQL部署与管理快捷性、方便性角度出发选择降低MySQL版本。

3、MySQL作为一款很成熟的开源软件,官方文档是很健全的,遇到的任何问题都尽可能优先从官方文档得寻求帮助,所以一定的英语水平还是要的。

4、享受解决问题的过程,回到最初DB开发同事对我的DBA工作的定义,我认为享受这个过程才有助于达到最终的目标。

其他

MySQL更换版本报错

The Auto-extending innodb_system data file ‘./ibdata1’ is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!

./ibdata1默认路径
/var/lib/mysql/

解决方案,每次转换版本都重建/var/lib/mysql/ 目录,在启动mysqld时进行初始化。
PS:建议原始安装时可采用此操作, 当数据库有数据时还是要进行ETL操作的。