强行升级MYSQL的路子

阅读次数: 1,184

  • A+
所属分类:LINUX MYSQL 运维

先说遇到的问题吧,以防等下忘掉了。

1、要不要卸载原来的mysql

2、PHP要不要重新编译(第一个服务器最终还是重新编译了)

3、思路是先升级mysql再动态把mysql和mysqli及PDO编译进来但是升级后的mysql5.6使用rpm安装的导致无法确定确切的安装位置这样致使在 phpize的时候指定不到msyql的安装目录(网上说的是 --with-mysql=/usr 这样会有错误提示 --with-mysql-dir=/usr 也有这种解决的办法)最终我的配置如下

./configure \
> --prefix=/usr/local/php-5.5/ \
> --with-config-file-path=/usr/local/php-5.5/etc/ \
> --with-apxs2=/usr/local/apache2/bin/apxs \
> --with-pdo-mysql \
> --with-mysql-dir=/usr/ \ ##加上这个会出错
> --with-libxml-dir=/usr/local/libxml2/ \
> --with-png-dir=/usr/local/libpng/ \
> --with-jpeg-dir=/usr/local/jpeg6/ \
> --with-freetype-dir=/usr/local/freetype/ \
> --with-gd=/usr/local/gd2-2/ \
> --with-zlib-dir=/usr/local/zlib/ \
> --with-mcrypt=/usr/local/libmcrypt/ \
> --enable-soap \
> --enable-mbstring=all \
> --enable-lssockets

这个是 重新编译php时的配置

4、编译后出现 phpinfo里边没有msyqli 和mysql 这时候有人会说你配置的时候没有配置mysql和mysqli所以phpinfo里当然没有了。是的的确如此,但在编译的时候配置msyql和msyqli老是出错,我就想在编译后再动态加载mysqli


 PHP编译支持mysqli
前提是必须安装mysql
直接上命令
先进入源码包我的源码包是在
/usr/local/php-5.2.1/ext/mysqli
这样进入 cd /usr/local/php-5.2.1/ext/mysqli
然后执行
/usr/local/php/bin/phpize
这条命令是生成configure
接下来再执行:
./configure --prefix=/usr/local/php/ext/mysqli --with-php-config=/usr/local/php/bin/php-config --with-mysqli=/usr/local/mysql/bin/mysql_config
执行结果如下:

再执行:
make && make install clean
执行结果如下:

他说mysqli,so保存在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/下
这样我们就可以通过cp命令来将mysqli.so复制到php的扩展目录下
接着执行这条命令来复制mysqli.so到php扩展目录下
cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/mysqli.so /usr/local/php/ext/mysqli.so
如果没任何提示则表示复制成功!
复制成功之后则可以去编辑php的配置文件了
执行如下命令来编辑php配置文件
vi /usr/local/php/lib/php.ini
使用vi打开php配置文件之后添加如下行:
extension=mysqli.so
保存退出

[root@localhost mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config --with-mysql=/usr/local/mysql/ --with-zlib-dir=/usr/local/lib

动态编译msyql的配置 (里边会有错误)

重启apache


附:

centos6.5安装msyql5.6

一、前言

在日常工作、学习当中,Mysql几乎是任何一名程序员都会接触、使用的关系型数据库管理系统,但大多数开发人员可能更多关注于Mysql的CRUD操作;而有些时候,需要我们对Mysql的默认参数进行一些调整、优化,如最大连接数、高速缓存大小、缓存中线程数量等,当然,做这些之前,有必要了解如何安装Mysql,本文将对阿里云CentOS 6.5下安装Mysql 5.6步骤进行讲解。

二、安装步骤

(注:图片看不清的,可单独打开图片看高清大图)
第一步:查看是否已有老版本Mysql,如果有,则卸载,没有则跳过该步骤。
先查看机器是否存在安装包、是否已经安装的服务,如果有,则删除或卸载
查看命令:

rpm -qa|grep -i mysql
  • 1

删除命令:

rpm -ev 文件名
  • 1

卸载命令:

yum remove MySQL-server MySQL-devel
  • 1

强行升级MYSQL的路子


然后再执行 whereis mysql命令,查看残余mysql目录,有哪些目录,就用 rm -rf 目录 命令删除之;然后再依次执行以下几个删除命令删除相关文件,这条rm -rf /var/lib/mysql命令尤其重要(当然,如果是全新系统的话,这几个文件可能压根就没有,删除时还会抛异常,这个没关系)

rm –rf /usr/my.cnf
rm -rf /root/.mysql_sercret
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql
  • 1
  • 2
  • 3
  • 4

第二步:安装新版本Mysql

1、创建下载安装包的目录(笔者目录为/usr/local/tools)
命令:

mkdir -p /usr/local/tools
  • 1

2、 下载
先进入创建的目录,然后依次执行下载命令
命令:

cd /usr/local/tools
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-server-5.6.21-1.rhel5.x86_64.rpm 
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-client-5.6.21-1.rhel5.x86_64.rpm
  • 1
  • 2
  • 3
  • 4

 

强行升级MYSQL的路子
强行升级MYSQL的路子
下载命令执行完后,执行ll命令可以看到3个下载好的安装包。可在下载命令中,将版本号直接改成自己所需的版本号,下载相应版本安装包。也可到mysql官方下载所需版本(CentOS 可以下载Red Hat Enterprise Linux / Oracle Linux版本的)。
下载地址: http://dev.mysql.com/downloads/mysql/
下载步骤:
强行升级MYSQL的路子
强行升级MYSQL的路子
强行升级MYSQL的路子
3、 安装
下载完成后,依次输入以下命令进行安装:

rpm -ivh MySQL-server-5.6.21-1.rhel5.x86_64.rpm
rpm -ivh MySQL-client-5.6.21-1.rhel5.x86_64.rpm
rpm -ivh MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
  • 1
  • 2
  • 3

安装MySQL-server-5.6.21-1.rhel5.x86_64.rpm时,会显示一个进度条,最后会输出很多安装信息;注意下图中标识出来的信息,这2句提示信息说明了安装后“密码”、“默认配置文件”所在路径。

强行升级MYSQL的路子
强行升级MYSQL的路子

安装MySQL-client-5.6.21-1.rhel5.x86_64.rpm:
强行升级MYSQL的路子
安装MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
强行升级MYSQL的路子
4、 修改配置文件、初始化Mysql
4.1、修改配置文件路径到etc目录,命令:

 cp /usr/share/mysql/my-default.cnf /etc/my.cnf
  • 1

4.2、初始化Mysql ,命令:

/usr/bin/mysql_install_db
  • 1

执行命令后,会有许多提示信息,包括如何启动mysql、数据引擎、警告信息等

强行升级MYSQL的路子

4.3、查看mysql服务是否已经启动,若没有启动,则启动mysql:
查看命令:

ps -ef|grep mysql
netstat -anpt|grep 3306
  • 1
  • 2

启动命令:(老版本用service mysqld start命令)

service mysql start
  • 1

启动成功,查看结果如下:
强行升级MYSQL的路子
(若没有启动成功,且启动时抛The server quit without updating PID file 异常,请查看后面“三、可能出现的异常”中的第4条)
5、修改root账户初始密码
因为Mysql安装好后的初始默认密码是一个随机密码,我们可能需要修改成我们自己设置的密码:
查询默认密码命令:

more /root/.mysql_secret  
  • 1

查看到初始密码后,使用mysql -uroot -pj3R5qTNxrKsxnQTj 命令登录Mysql:(j3R5qTNxrKsxnQTj即为笔者查到的初始密码)
强行升级MYSQL的路子
查看安装好的Mysql的版本:
强行升级MYSQL的路子
修改密码为123456:
命令:

set password = password('123456');
  • 1

修改密码成功后用新密码登录:(原初始密码已登录不了)
强行升级MYSQL的路子

强行升级MYSQL的路子

6、修改Mysql服务开机时自动启动(不需要则略过)
设置命令:

chkconfig mysql on;
  • 1

查看设置结果命令:

chkconfig mysql --list;
  • 1

强行升级MYSQL的路子
7、客户端连接
笔者使用Navicat Premium工具连接:
强行升级MYSQL的路子
登录成功:
强行升级MYSQL的路子
(若登录失败,报“1130,…is not allowed to connect to this MySQL servcer”错误,请查看“三、可能出现的异常”中的第5条)
至此,阿里云CentOS 6.5安装Mysql 5.6就算完成了。

三、可能出现的异常

1、使用命令rpm -ev 文件名卸载文件不掉,抛error: Failed dependencies。(在后面加–nodeps参数)
2、4.1条复制文件时,可能提示是否覆盖(是,选y)。
3、安装时,可能出现有些依赖包没有的,直接只用yum install -y命令安装即可。
4、启动时可能报“The server quit without updating PID file ([FAILED]/mysql/iZ94alccp3jZ.pid)”异常。
当出现这个异常时,可能大多数人的第一反应是,去网上搜索关键字,然后查到的解决办法无外乎以下几个方法:
a、查看磁盘、mysql权限、linux系统配置是否正常,若不正常,授权修复;
b、修改/etc/my.cnf 配置文件,修改innodb_buffer_pool_size等默认配置参数;
c、重启机器、清除Mysql并重新安装;
如果以上几个方法能够解决,那么恭喜;如果以上方式依然不能解决,请接着往下看笔者的解决过程。
a、首先,我们应该确认,到底为什么会抛这个异常呢?所以,我们进入mysql的错误日志中查看原因;(错误日志一般在/var/lib/mysql/目录下,笔者的错误日志文件为/var/lib/mysql/iZ94alccp3jZ.err)
b、查看日志,我们会发现出错的更详细信息
强行升级MYSQL的路子
通过日志中的描述,发现InnoDB问题,以为是Mysql默认内存大大,然后赶紧修改可my.cnf中的innodb_buffer_pool_size默认值,发现没用。然后用free -m命令查看了系统内存:
强行升级MYSQL的路子
发现是Swap的问题,然后配置1G的Swap,依次执行以下命令:
命令:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo mkswap /swapfile
sudo swapon /swapfile
free -m
  • 1
  • 2
  • 3
  • 4

强行升级MYSQL的路子
执行以上操作后,再执行命令service mysql start启动,启动成功!
5、客户端工具navicat 连接Mysql报错“1130,…is not allowed to connect to this MySQL servcer”。
强行升级MYSQL的路子
原因:
由错误码“1130”及错误提示可知,这是由于Mysql的root账户是否允许其他机器远程登录的问题。
解决方法:
设置允许其它机器远程登录。(真正生产环境,需要设置只允许特定ip访问等一系列Mysql权限控制,此处不再深入)
a、登录Mysql;
b、修改mysql库中的user表:(”%”表示root可以由任意主机登录Mysql)
强行升级MYSQL的路子
c、退出登录Mysql,重启Mysql服务:(exit;命令,或Ctrl+C快捷键均可退出登录)
强行升级MYSQL的路子
d、用客户端工具再次登录,即可登录成功。

四、总结

1、Mysql的安装,看安装时输出信息很重要,很多信息都有描述;其中,出错时的错误日志信息尤其重要,报错的详细信息里面都有描述。切忌因为是大量英文而忽略不看!
2、其实用 yum install命令可以直接安装当前系统默认伴随的旧版本Mysql,相对而言更简单,本文的意义在于可以安装自己指定的版本。(笔者系统默认的是Mysql5.1)


附 php中测试mysql是否连接
MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension。MySQLi 的 i 代表 Improvement ,提供了相对进阶的功能,就 Extension 而言,本身也增加了安全性。而 PDO(PHP Data Object)则是提供了一个 Abstraction Layer 来操作数据库,光从理论上看不出来有什么差别,所以就直接看代码吧。首先,先来看一段用 MySQL 编写的代码:
Php代码 收藏代码
乍看之下没有什么问题,其实背后还是有些学问的。
这种方式不能 Bind Column,$location 的地方容易被 SQL 注入。于是后来发展出了 mysql_escape_string()(备注:5.3.0 之后弃用)以及 mysql_real_escape_string() 来解决这个问题,不过这么一搞,整个过程会变得复杂丑陋,而且如果参数多了,可以想象会是怎样的情形……
Php代码 收藏代码

在 MySQLi 中有了不少进步,除了通过 Bind Column 来解决上述问题,我们可以对比一下 Object oriented style(下面这段 MySQLi 范例的写法)和 Procedural style(上面 MySQL 范例的写法)两种写法的差别。
Php代码 收藏代码
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location);
$stmt->execute();
$stmt->bind_result($id, $name, $gender, $location);
while ($stmt->fetch())
{
echo $id . $name . $gender . $location;
}
$stmt->close();
$mysqli->close();
?>

又发现了一些缺点,例如得 Bind Result,这个就有点多余,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(Abstraction)的方法,所以当后端更换数据库的时候,就是痛苦的开始了。
于是 PDO 就出现了(备注:目前 Ubuntu 和 Debian 来说,PDO 并没有直接的套件可以安装,而是必须通过 PECL 安装)。
Php代码 收藏代码
roga@carlisten-lx:~$ pecl search pdo

=======================================
Package Stable/(Latest) Local
PDO 1.0.3 (stable) PHP Data Objects Interface.
PDO_4D 0.3 (beta) PDO driver for 4D-SQL database
PDO_DBLIB 1.0 (stable) FreeTDS/Sybase/MSSQL driver for PDO
PDO_FIREBIRD 0.2 (beta) Firebird/InterBase 6 driver for PDO
PDO_IBM 1.3.2 (stable) PDO driver for IBM databases
PDO_INFORMIX 1.2.6 (stable) PDO driver for IBM Informix INFORMIX databases
PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO
PDO_OCI 1.0 (stable) Oracle Call Interface driver for PDO
PDO_ODBC 1.0.1 (stable) ODBC v3 Interface driver for PDO
PDO_PGSQL 1.0.2 (stable) PostgreSQL driver for PDO
PDO_SQLITE 1.0.1 (stable) SQLite v3 Interface driver for PDO
pdo_user 0.3.0 (beta) Userspace driver for PDO

当通过 PECL 安装装好后,就可以通过以下方式来操作数据库:
Php代码 收藏代码
$sth->execute(array($location, $name));
$result = $sth->fetch(PDO::FETCH_OBJ);
echo $result->name . $result->location;
$dbh = NULL; //by www.jbxue.com
?>

乍看之下,PDO 的代码好像也没有变短,那到底好处是什么呢?
1、PDO 连接数据库时通过 Connection String 来决定连接何种数据库。
2、PDO 可以通过 PDO::setAttribute 来决定连接时的设定,比如 Persistent Connection,回传错误的方式(Exception,E_WARNING,NULL)。甚至是回传参数名称的大小写等等。
3、PDO 支持 Bind Column 的功能,除了基本的 Prepare,Execute 以外,也可以 Bind 单一参数,并且指定参数类型。
4.、PDO 是 Abstraction Layer,所以就算更换储存媒介,需要花的功夫比起来是最少的。
可惜的是,尽管这些东西都已经出现很久了,但还是不够大众化。我想或许是因为大家习惯看坊间的书籍学习,但那些书本往往只会介绍最简单最传统的方式,导致很多人还是在用 MySQL 这种方直接连数据库。
不过,目前来说我个人还是最喜爱通过 DBI 来连接数据库,像是 ActiveRecord 以及 Propel ORM(Object-Relational Mapping)。
例如说以 ActiveRecord 为例,如果要实现这样的 SQL 叙述:
Sql代码 收藏代码
INSERT INTO `users` (id, name, gender, location) VALUES(1, 'roga', 'male', 'tpe')

以 PDO 来写是:
Php代码 收藏代码
$sth->execute(array(1, 'roga', 'male', 'tpe'));
?>

但以 ActiveRecord 来说的话,则是:
Php代码 收藏代码
$user->name = 'roga';
$user->gender = 'male';
$user->location = 'tpe';
$user->save();
?>

后者在语法上是不是简洁很多呢,而且也大幅降低对 SQL 语言的依赖性!不同数据库对 SQL 实作的问题可参考 Comparison of different SQL implementations。


 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: