背景
当我登陆博客时才发现,原来有关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操作的。