MySQL安装一般使用RPM或者源码安装的方式。
RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整。
源码安装的优点是可以自定义安装目录,缺点是编译时间长,过程复杂

其实还有一种方式,定制RPM包.
它相当于用源码安装的方式定制了一个RPM包.一次打包,可以多次使用
它可以定制路径,安装时自动创建帐号,自动配置服务,环境变量等,并且安装过程快速,简单。
在大规模部署的场景下,优点十分突出.
缺点是制作RPM包,需要自己编写Red Hat定义的spec文件.而spec文件编写的学习曲线比较陡.

需求如下
1.创建用户mysql
2.数据库软件安装在/home/mysql/mysql-5.6.14目录
3.数据文件存放在/data目录下
4.配置服务,自动启动

首先,下载rpmbuild
yum install rpm-build -y
它是Red Hat用于打RPM包的工具.
安装之后重启计算机,可以看到/root/rpmbuild目录下有如下文件夹

这个工具打包的过程大致如下,
编写spec指定打包的过程
将源码压缩包放在SOURCES目录下,
将源码解压缩到BUILD目录,执行make命令
将make install 的结果放在BUILDROOT目录下,
最后将BUILDROOT下编译好的二进制文件制作成RPM包。
并且可以指定在RPM安装之前,安装之后,卸载等过程执行的命令

首先,下载源码包
http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.14.tar.gz
并将其复制到指定的目录
/root/rpmbuild/SOURCES/mysql-5.6.14.tar.gz

安装编译MySQL需要的依赖包
yum -y install make gcc-c++ cmake bison-devel  ncurses-devel

编写spec脚本
vim mysql.spec

Name:       MySQL
Version:    5.6.14    
Release:    1%{?dist}
Summary:    MySQL-5.6.14 RPM

Group:      applications/database
License:    GPL    
URL:        http://www.mysql.com    
Source0:    mysql-5.6.14.tar.gz
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires:  cmake

AutoReqProv: no
%description
MySQL 5.6.14

%define MYSQL_USER mysql
%define MYSQL_GROUP mysql

%prep
%setup -n mysql-%{version}

%build
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql/mysql-5.6.14 \
-DMYSQL_DATADIR=/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make -j `cat /proc/cpuinfo | grep processor| wc -l`

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}

%pre
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data

%post
/home/mysql/mysql-5.6.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc

%preun
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql

%clean
rm -rf %{buildroot}

%files
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /home/mysql/mysql-5.6.14/*

%changelog

这个脚本各个Segment的作用请参考
http://machael.blog.51cto.com/829462/213477

其中
Source0:    mysql-5.6.14.tar.gz
这个压缩文件需要放在指定的目录中(/root/rpmbuild/SOURCES)
自动解压的时候,会在这个指定目录中找这个文件

AutoReqProv: no
这个参数必须设置,否则在安装的时候,会显示有依赖包的缺失.实际上是不需要的。

%setup -n mysql-%{version}
解压源码包之后,会进入目录执行build,它默认是根据%{name}和%{version}拼接的目录.
以MySQL为例,在spec中写的name为MySQL,version为5.6.14
那么它会进入MySQL-5.6.14的目录,
但是源码包解压之后的目录是mysql-5.6.14(小写)
所以在setup这个段使用-n参数,匹配这个目录.(就是说默认的设置不灵,需要自己匹配目录)

make -j `cat /proc/cpuinfo | grep processor| wc -l`
查看计算机有几个核,然后多线程编译

这个脚本的过程是这样的
首先解压源码包
%prep
%setup -n mysql-%{version}

然后执行%build的过程,make编译

然后执行%install
将编译之后的代码真实的安装一遍,
它安装的目录是/root/rpmbuild/BUILDROOT/MySQL-5.6.14-1.el6.i386/home/mysql/mysql-5.6.14/
因为我们指定的安装目录是/home/mysql/mysql-5.6.14/,它相当于在一个沙盒中安装了一遍.
它会将沙盒中安装之后的文件打成RPM包

%files就是指定哪些沙盒中的文件打入RPM包
%files指定的文件是相对路径,绝对路径应该是%{buildroot}/home/mysql/mysql-5.6.14
默认的%{buildroot}就是/root/rpmbuild/BUILDROOT/MySQL-5.6.14-1.el6.i386/

这个%{buildroot}是由spec文件的BuildRoot设置的
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

%pre是RPM安装之前执行的命令
这里主要是创建数据文件的目录和帐号
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data

%post是RPM安装之后执行的命令
这里主要是创建数据库实例,配置服务,配置环境变量
/home/mysql/mysql-5.6.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc

%preun是卸载RPM包执行的命令,主要用于清理
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql

其实编写spec文件本质上是在写一个回调函数,rpmbuild根据spec的回调函数,生成一个Shell脚本,打包的过程就是执行Shell脚本的过程。

定制RPM安装包可以满足大规模自动化部署的场景
因为它可以
定制配置文件(将配置文件放在ftp或者http上,在%post段下载这个配置文件放在/etc下)
定制安装目录和数据文件,日志文件的目录(生产系统不同的挂载点,底层可能是不同的物理设备)
自动创建帐号,配置服务和环境变量

这些特性在规模很小时微不足道,
比如给研发和测试安装,人家还嫌你有毛病.明明一个rpm能搞定,你还整这么复杂,不是臭显摆吗?
生产环境装一个库运行好几年,再装的时候,这个RPM估计都忘了放哪里了...
但是一旦规模上来了,一天需要装个10台8台的,这个自动化安装的优点就显现出来了

参考:
源码安装MySQL
http://www.cnblogs.com/xiongpq/p/3384681.html

rpmbuild spec文件详解
http://machael.blog.51cto.com/829462/213477
http://www.worldhello.net/2011/04/02/2405.html

AutoReqProv参数的解释
http://blog.csdn.net/peng_zhou/article/details/3530230

mysql自动化安装的更多相关文章

  1. MySQL自动化安装(双主多从读写分离)

    shell #!/bin/bash # Create by # version 1.0 # // # # check out lockfile whether or not exist IsInput ...

  2. mysql自动化安装脚本(二进制安装)

    为了日后安装数据库方便,遂写了一个自动安装MySQL的脚本: 测试可以安装mariadb和MySQL-5.7.X 安装前配置好对应的my.cnf文件放在/tmp路径下 将启动脚本mysql3306放在 ...

  3. Mysql单实例脚本自动化安装

    安装包:mysql-5.6.31.tar.gz 已有配置文件:my.cnf *注意:本次Mysql的配置文件是在my.cnf的基础上更改得到的,my.cnf存放路径为/opt/rh/my.cnf 脚本 ...

  4. lnmp_auto:自动化安装lnmp环境脚本

    朋友找我在一台机器上帮忙安装下discuz.想着搭建过好几次的lnmp了,但是还没有使用过"一键安装"的自动化脚本,去网上有搜索出来,但是运行的时候发现用root运行别人的脚本还是 ...

  5. 【转】lnmp_auto:自动化安装lnmp环境脚本

    原文链接: lnmp_auto:自动化安装lnmp环境脚本  这哥们整理的这篇博文很好  转载分享 博文转载如下: 源代码在github上:https://github.com/jianfengye/ ...

  6. MySQL5.6生产库自动化安装部署

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1846671 自动化运 ...

  7. Inception介绍(MySQL自动化运维工具)

    Inception介绍 GitHub:https://github.com/mysql-inception/inception 文档:https://mysql-inception.github.io ...

  8. HUE的自动化安装部署

    HUE=Hadoop User Experience(Hadoop用户体验),直白来说就一个开源的Apache Hadoop UI系统,由Cloudera Desktop演化而来,最后Cloudera ...

  9. 部署MySQL自动化运维工具inception+archer

    ***************************************************************************部署MySQL自动化运维工具inception+a ...

随机推荐

  1. Android性能优化方法(五)

    有时候,我们的页面中可能会包含一些布局,这些布局默认是隐藏的,当用户触发了一定的操作之后,隐藏的布局才会显示出来.比如,我们有一个Activity用来显示好友的列表,当用户点击Menu中的“导入”以后 ...

  2. Log4j 配置数据库连接池(将日志信息保存到数据库)

    org.apache.log4j.jdbc.JDBCAppender 是利用传统的 JDBC 连接方法,这种方式连接数据库效率低下,为了解决这个问题,现在自定义一个 Log4j 的 Appender, ...

  3. 从DB灌值到DataTable时,字段值为NULL时报错相关信息;

    报错信息: 1.  2.  3.  4.  5.  6.  解决方法: 1. Data Layer SQL 语句取数据时,把其列值有为null的字段用0.00替换,(ISNULL的用法): 2. #r ...

  4. [leetcode 17]Letter Combinations of a Phone Number

    1 题目: Given a digit string, return all possible letter combinations that the number could represent. ...

  5. entlib验证组件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...

  7. HttpLib - 一个对 Http 协议进行封装的库

    今日,在 Codeplex 上看到一个开源项目,对 Http 协议进行了封装,这下可以方便这些在 .NET 平台下访问 Web 服务器的同学们了,比如,从 Web 服务器抓取一个页面,使用 .NET ...

  8. 基于OWIN WebAPI 使用OAuth授权服务【客户端模式(Client Credentials Grant)】

    适应范围 采用Client Credentials方式,即应用公钥.密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open ...

  9. 学习WPF——元素绑定

    概念 从源对象提取一些信息,并用这些信息设置目标对象的属性 示例 在给TextBlock控件的FontSize属性赋值时,我们使用了绑定表达式 数据绑定表达式使用XAML的标记扩展(因此具有花括号)( ...

  10. MySql、SqlServer、Oracle 三种数据库查询分页方式

    SQL Server关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活 ...