在前两篇中,安装了一个基本的Web服务器,但是只能提供静态网页查看,要做成动态网站,就必须要数据库配合其他编程语言支持了,这里先介绍MySQL数据库的安装。
互联网架构中,把存储和数据库两个瓶颈搞定,其他的都很简单了,可见数据库的重要性,数据库(Database),简单来说,就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。
MySQL是一个开源的数据库,由瑞典MySQL AB公司开发与维护,现在属于Oracle公司,在互联网行业应用的很广泛,那为什么选择MySQL,可以有如下原因:
- 性能卓越、服务稳定、很少出现异常宕机
- 开放源代码且无版权制约(遵守GPL协议),自主性及使用成本低
- 历史悠久,社区及用户非常活跃,遇到问题,可以寻求帮助
- 体积小,安装使用简单,并且易于维护,安装及维护成本低
- 品牌口碑效应,使得企业无需考虑就直接用,LAMP、LNMP流行架构
- 支持多种操作系统,提供多种API接口,支持多种开发语言
MySQL的发布采用双授权政策,分社区版和商业版,这两个版本又各自分四个版本依次发布:Alpha版、Beta版、RC版和GA版本。
商业版与社区版的区别:
- 商业版本组织管理与测试环节控制更严格,稳定性方面,会比社区版更稳定
- MySQL是成熟产品,商业版与社区版之间性能差别不大
- 商业版不遵守GPL协议,社区版遵守GPL协议可以免费使用
- 使用商业版可以购买相关的服务,享受7*24小时技术支持以及定时打补丁等服务,但是用户必须为此支付服务费用
- 社区版本的维护服务只能靠社区提供
Alpha版、Beta版、RC版和GA版本之间的说明及区别:
- Alpha版一般只在开发的公司内部运行,不对外公开,开源的会对外
- Beta版一般是完成功能的开发和所有的测试工作之后的产品,不会存在较大的功能或性能BUG,并且邀请或提供用户体验与测试,以便更全面地测试软件的不足之处或存在的问题
- RC版属于生产环境发布之前的一个小版本或称候选版,是根据Beta版本测试结果,收集到的BUG或缺陷之处等收集到的信息,进行修复和完善之后的一版产品。
- GA版是软件产品正式发布的版本,也称生产版本的产品,一般情况下,企业的生产环境都会选择GA版。
MySQL数据库版本命名由3个数字和一个后缀组成,如:mysql-5.7.19.tar.gz
- 主版本号,描述了文件格式,所有版本5发行都有相同的文件格式
- 发行级别,主版本号和发行级别一起构成发行序列号
- 此次发行系列的版本号,随每个新分发版递增,通常会选择发行的最新版本
每次更新后,版本字符串最后一个数字会递增,如对于前一个版本增加了新功能,版本字符串第二个数字递增,如文件格式改变,第一个数字会递增。
企业生产环境MySQL版本选择建议:
- 选择开源的社区版的稳定版的GA版本
- 可以选择5.1或5.5、5.7
- 选择MySQL数据库GA版发布后6个月以上的GA版本
- 要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本
- 最好向后较长时间没有更新发布的版本
- 要考虑开发人员开发程序使用的版本是否兼容你选的版本
- 作为内部开发测试数据库环境,跑大概3-6个月的时间
- 优先企业非核心业务采用较新版本的GA版本
- 向DBA高手请教
下面来记录一下从源码安装的步骤,当然,MySQL也有其他安装方式,比如:
- yum安装,适用于对数据库要求不太高的场合,例如并发不大,公司内部、企业内部的一些应用场景。企业内部把源码编译后的版本制作成内部yum源码安装的方式除外。
- 常规方式,如"./configure; make; make install"(版本5.1及以前的安装模式)
- cmake方式(cmake, make, make install)- 5.5及以上的安装模式,使用机器数量少,多就麻烦了
- 二进制方式,免去了编译,与yum安装模式类似,与cmake安装方式安装性能区别不大
使用yum下载安装rpm包时如果机器比较多,可以自己搭建yum源,然后定制rpm包,这样更方便于使用ssh多机自动安装。
源码安装的mysql版本为5.5.32,使用cmake编译安装,下面开始记录安装步骤吧:
1. 安装准备:
MySQL5.5版本以上改为使用cmake工具编译安装了,安装之前需要安装依赖库ncurses-devel:
1.1 cmake安装:
a. 解压: tar xf cmake-***
b. cd cmake-**
c. ./configure,结果如下:
最后提示我们允许gmake即可。
d. gmake
e. sudo gmake install
f. 查看是否安装成功:
1.2 ncurses-devel安装: (小tips: 不要使用yum remove来删除软件,这样会删除一些依赖库,从而造成其他软件的使用出现问题!!)
sudo yum install -y ncurses-devel
sudo yum install -y libaio-devel (多实例安装时还需要这个包)
2. MYSQL安装:
2.1 创建mysql用户和mysql用户组
sudo groupadd mysql
sudo useradd mysql -s /sbin/nologin -M -g mysql
2.2 解压mysql压缩包并进入mysql安装目录
cmake . -DCMAKE_INSTALL_PREFIX=/home/linjk/usr/mysql/mysql-5.5.32 \
-DMYSQL_DATADIR=/home/linjk/usr/mysql/mysql-5.5.32/data \
-DMYSQL_UNIX_ADDR=/home/linjk/usr/mysql/mysql-5.5.32/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DENABLE_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_ZLIB=bundled \
-DENABLE_LOCAL_INFILE=1 \
-DWITH_READLINE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0
注意: "-Dxxxx"前面不能有空格,否则会提示目录找不到的错误
(更多的编译选择可以从mysql官网查看:http://dev.mysql.com/doc/internals/en/cmake-howto-detailed.html)
2.3 执行"make && sudo make install"进行mysql数据库安装,安装步骤可能时间有点长。使用的虚拟机,内存为2G,我make的时间大概8分钟,install大概10秒.
------> 如果是安装数据库多实例,则安装到这里,接下去采用新的步骤:
说明:为了灵活性,采用多个启动程序结合多个配置文件的多实例安装方式
A. 创建目录
mkdir -p /mysql_data/{3306, 3308}/data ,执行后目录结构如下:
3306和3308分别对应两个实例的端口目录入口,实例的配置文件和启动文件会在对应端口目录下。
B. 复制配置文件并修改:
修改配置文件,内容如下,部分参数根据路径修改,另外要注意,server-id要不一样:
[client]
#password = your_password
port = 3306
socket = /mysql_data/3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /mysql_data/3306/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 8M
table_open_cache = 4
sort_buffer_size = 1M
join_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
net_buffer_length = 2K
thread_stack = 128K
basedir = /mysql/mysql-5.5.32
datadir=/mysql_data/3306/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 300
table_cache = 614
external-locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
long_query_time = 1
log-error = /mysql_data/3306/error.log
log-slow-queries = /mysql_data/3306/slow.log
pid-file = /mysql_data/3306/mysql.pid
log-bin = /mysql_data/3306/mysql-bin
relay-log = /mysql_data/3306/relay-bin
relay-log-info-file = /mysql_data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
bulk_insert_buffer_size = 1M
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db = mysql
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
server-id = 1
# Uncomment the following if you want to log updates
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /mysql/mysql-5.5.32/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /mysql/mysql-5.5.32/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
#innodb_additional_mem_pool_size = 4M
#innodb_buffer_pool_szie = 32M
#innodb_data_file_path = ibdata1:128M:autoextend
#innodb_file_io_threads = 4
#innodb_thread_concurrency = 8
#innodb_flush_log_at_trx_commit = 2
#innodb_log_buffer_size = 2M
#innodb_log_file_size = 4M
#innodb_log_files_in_group = 3
#innodb_max_dirty_pages_pct = 90
#innodb_lock_wait_timeout = 120
#innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
log-error = /mysql_data/3306/mysql_3306.err
pid-file = /mysql_data/3306/mysqld.pid
= your_password
port = 3306
socket = /mysql_data/3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /mysql_data/3306/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 8M
table_open_cache = 4
sort_buffer_size = 1M
join_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
net_buffer_length = 2K
thread_stack = 128K
basedir = /mysql/mysql-5.5.32
datadir=/mysql_data/3306/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 300
table_cache = 614
external-locking = FALSE
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
long_query_time = 1
log-error = /mysql_data/3306/error.log
log-slow-queries = /mysql_data/3306/slow.log
pid-file = /mysql_data/3306/mysql.pid
log-bin = /mysql_data/3306/mysql-bin
relay-log = /mysql_data/3306/relay-bin
relay-log-info-file = /mysql_data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
bulk_insert_buffer_size = 1M
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db = mysql
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
server-id = 1
# Uncomment the following if you want to log updates
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /mysql/mysql-5.5.32/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /mysql/mysql-5.5.32/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
#innodb_additional_mem_pool_size = 4M
#innodb_buffer_pool_szie = 32M
#innodb_data_file_path = ibdata1:128M:autoextend
#innodb_file_io_threads = 4
#innodb_thread_concurrency = 8
#innodb_flush_log_at_trx_commit = 2
#innodb_log_buffer_size = 2M
#innodb_log_file_size = 4M
#innodb_log_files_in_group = 3
#innodb_max_dirty_pages_pct = 90
#innodb_lock_wait_timeout = 120
#innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
log-error = /mysql_data/3306/mysql_3306.err
pid-file = /mysql_data/3306/mysqld.pid
C. 创建启动文件,以3306实例启动脚本为例:
#!/bin/bash
#init
port=3306
mysql_user="root"
mysql_pwd="ljk121121"
CmdPath="/mysql/mysql-5.5.32/bin"
mysql_sock="/mysql_data/${port}/mysql.sock"
#startup
function_start_mysql()
{
if [ ! -e "$mysql_sock" ]; then
printf "Starting MySQL...\n"
/bin/bash ${CmdPath}/mysqld_safe --defaults-file=/mysql_data/${port}/my.cnf 2>&1>/dev/null &
else
printf "MySQL is Running...\n"
exit
fi
}
#stop
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ]; then
printf "MySQL is stopped..\n"
exit
else
printf "Stopping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p ${mysql_pwd} -S /mysql_data/${port}/mysql.sock shutdown
fi
}
#restart
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage:/mysql_data/${port}/mysql {start|stop|restart}\n"
esac
D. 授权目录
授权mysql用户访问mysql_data目录
chown -R mysql.mysql /mysql_data/
使mysql脚本可执行
find /mysql_data/ -type f -name "mysql" | xargs chmod +x
E. 配置环境变量,步骤同下文的2.5步骤
F. 初始化多实例数据库文件,目的是创建基础的数据库文件,如mysql库表
cd /home/linjk/mysql-5.5.32/scripts/
chmod +x mysql_install_db
./mysql_install_db --basedir=/mysql/mysql-5.5.32/ --datadir=/mysql_data/3306/data --user=mysql
同理 ./mysql_install_db --basedir=/mysql/mysql-5.5.32/ --datadir=/mysql_data/3308/data --user=mysql
可以查看一下生成的数据表目录结构:
G. 初始化数据文件成后,启动数据库
若出现配置InnoDB参数失败造成启动错误,需要先删除data目录下的ib_data*文件
可以在mysql_3306.err看到启动日志输出:
3308实例类似启动即可,启动后监听接口如下,现在双实例启动MySQL数据库完成了:
附:
多实例使用mysql -u root -p xxx 无法登陆的:
对于多实例,登陆需要使用sock文件:mysql -S *.sock:
发现此时root用户还没有密码,修改密码:
/mysql/mysql-5.5.32/bin/mysqladmin -u root -S mysql.sock password 'ljk121121' (需要先启动数据库才能更改,因为这里用到mysql.sock文件!!!)
然后可这样登陆:/mysql/mysql-5.5.32/bin/mysql -u root-p ljk121121 -S mysql.sock
新增MYSQL实例
H. 前面说到,采用多配置文件可以很灵活增加数据库,如果在一个my.cnf使用[mysql_multi]来配置多个实例,就需要重启,这样比较麻烦,现在就来新增一个实例,很简单,复制现有实例,修改一些参数就可以了:
然后初始化数据文件:
/mysql/mysql-5.5.32/scripts/mysql_install_db --basedir=/mysql/mysql-5.5.32/ --datadir=/mysql_data/3310/data/ --user=mysql
启动:
./mysql start
查看一下,实例启动成功:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------> 如果是常规安装数据库单实例,2.4步骤紧接2.3步骤即可,下文所有操作基于普通安装后操作:
2.4 拷贝mysql的模板配置文件到/etc目录下:(mysql启动后会默认首先从/etc/my.cnf读取数据库目录,都找不到后就会使用编译时的参数进行启动)
(修改替换配置文件先备份这个习惯需要养成)
2.5 为了方便使用mysql命令,需要配置环境变量:
echo 'export PATH=/home/linjk/usr/mysql/mysql-5.5.32/bin:$PATH' >> /etc/profile,如下示:
2.6 初始化数据文件:
2.6.1 改变目录授权:
sudo chown -R mysql.mysql /home/linjk/usr/mysql/mysql-5.5.32/data/
sudo chmod -R 1777 /tmp/
2.6.2 初始化数据文件:
cd /home/linjk/usr/mysql/mysql-5.5.32/scripts/
sudo ./mysql_install_db --basedir=/home/linjk/usr/mysql/mysql-5.5.32/ --datadir=/home/linjk/usr/mysql/mysql-5.5.32/data/ --user=mysql
2.6.3 拷贝mysql启动脚本到/etc/init.d目录下:
sudo cp support-files/mysql.server /etc/init.d/mysqld
sudo chmod u+x /etc/init.d/mysqld
2.6.4 启动数据库:
执行:sudo /etc/init.d/mysqld start 即可
2.6.5 使用命令“netstat -lntup | grep 3306”来确认一下是否启动成功。
2.6.6 现在就可以使用命令"mysql"登录了
如果出现无法登录,可以尝试kill掉mysqd进程,重新初始化一遍data文件。
3. 安装完后可以继续的其他操作:
3.1 删除空用户: delete from mysql.user where user=''; 提高安全性
3.2 mysql.user表中,'::1'host名字是ipv6的,不需要也可以进行删除
3.3 删除测试库: drop database test;
3.4 初始化用户密码:
/home/linjk/usr/mysql/mysql-5.5.32/bin/mysqladmin -u root password 'ljk121121'
3.5 配置开机启动:sudo chkconfig mysqld on
3.6 新增普通用户等个性化配置mysql即可
3.7 为了不同用户操作安全,可以修改root用户登录后mysql的操作提示符,默认是'>',这样可以视觉上让你会注意敏感的update和delete操作:
这种方式只是临时生效,为了长久生效,需要把这句放在my.cnf的'[mysql]'块里面
下一篇,将介绍LNMP平台搭建的最后一步,增加WEB服务器的PHP支持。