Home > Database > Mysql Tutorial > body text

Linux系统下自行编译安装MySQL及基础配置全过程解析_MySQL

WBOY
Release: 2016-05-27 13:45:29
Original
898 people have browsed it

安装依赖:

CentOS:

# yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip
Copy after login

Ubuntu:(使用ubuntu下面有不少需要root权限,请注意)

代码如下:


# sudo apt-get install -y g++ gcc make libpcre3 zlib1g libbz2-dev automake cmake perl libncurses5-dev bison

添加MySQL系统用户

# groupadd mysql
# useradd -r -g mysql mysql

Copy after login

提前建立好相关目录

# mkdir /data/logs/mysql
# mkdir /data/mysql

Copy after login

下载MySQL源代码:

# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.tar.gz

Copy after login

配置

# cmake \
Copy after login

-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_USER=mysql \
-DDEFAULT_CHARSET=utf8 \
-DEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLE_DOWNLOADS=1

Copy after login

配置释义:

-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 设置安装目录
-DMYSQL_DATADIR=/data/mysql 设置数据库存放目录
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock 设置UNIX socket 目录
-DMYSQL_USER=mysql 设置运行用户
-DDEFAULT_CHARSET=utf8 设置默认字符集,默认latin1
-DEFAULT_COLLATION=utf8_general_ci 设置默认校对规则,默认latin1_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 添加InnoDB引擎支持
-DENABLE_DOWNLOADS=1 自动下载可选文件,比如自动下载谷歌的测试包
-DMYSQL_TCP_PORT=3306 设置服务器监听端口,默认3306
-DSYSCONFDIR=/data/etc 设置my.cnf所在目录,默认为安装目录

更多参数执行 # cmake . -LH 或者查看官方说明

Note:

执行过程中会出现:

CMake Error: Problem with tar_extract_all(): Invalid argument
CMake Error: Problem extracting tar: /usr/local/src/mysql-5.6.12/source_downloads/gmock-1.6.0.zip
Copy after login

解决方法:
cd mysql目录下面会发现有一个source_downloads目录,需要解压unzip gmock-1.6.0.zip,然后再重新执行上述配置过程。当然你也可以去掉-DENABLE_DOWNLOADS=1这个选项,不编译谷歌的测试包也没有什么问题,但是之前的某些版本会出现无法编译的问题。

编译安装

# make && make install

Copy after login

建立链接文件,方便以后使用和升级:

# ln -s /usr/local/server/mysql-5.6.12 /usr/local/server/mysql

Copy after login

设置权限:

# chown -R mysql:mysql /usr/local/server/mysql
# chown -R mysql:mysql /usr/local/server/mysql-5.6.12
# chown -R mysql:mysql /data/mysql
# chown -R mysql:mysql /data/logs/mysql
Copy after login

初始化数据库

代码如下:

# /usr/local/server/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/server/mysql --collation-server=utf8_general_ci


这时候会出现以下警告,下面配置my.cnf会解决这个问题
详情请查看 MySQL 5.6 中 TIMESTAMP 的变化

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
配置启动项目:

# cp /usr/local/server/mysql/support-files/mysql.server /etc/init.d/mysql

Copy after login

修改安装目录下my.cnf,部分参数需要结合实际情况进行修改

[mysqld]
 
datadir = /data/mysql
socket = /tmp/mysql.sock
pid-file = /data/logs/mysql/mysql.pid
user = mysql
port = 3306
default_storage_engine = InnoDB
 
# InnoDB
#innodb_buffer_pool_size = 128M
#innodb_log_file_size = 48M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
 
# MyISAM
#key_buffer_size = 48M
 
# character-set
character-set-server=utf8
collation-server=utf8_general_ci
 
# name-resolve
skip-host-cache
skip-name-resolve
 
# LOG
log_error = /data/logs/mysql/mysql-error.log
long_query_time = 1
slow-query-log
slow_query_log_file = /data/logs/mysql/mysql-slow.log
 
# Others
explicit_defaults_for_timestamp=true
#max_connections = 500
open_files_limit = 65535
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
 
[client]
socket = /tmp/mysql.sock
port = 3306
Note:

Copy after login

被注释掉的部分语句,需要结合业务和硬件资源进行修改,所以先占位,使用默认值即可。my.cnf文件中不能出现拼写错误,否则,接下来启动会出现很多意想不到的错误,如果出现无法启动请参看:mysql-error.log文件。权限设置不当也会导致启动失败。

启动前,再次确认一遍权限:

很有可能现在my.cnf的权限不是mysql,同时检查一下/etc/my.cnf是否存在,如果存在则删除!!!

# chown -R mysql:mysql /usr/local/server/mysql-5.6.12

Copy after login

启动mysql:

# service mysql start

Copy after login

添加环境变量

#echo 'export PATH=$PATH:/usr/local/server/mysql/bin'>> /etc/profile
Copy after login

安全设置(设定初始密码,移除匿名用户,移除测试数据库):

# /usr/local/server/mysql/bin/mysql_secure_installation

Copy after login

添加开机启动

CentOS:

# chkconfig mysql on

Copy after login

Ubuntu:

# sudo update-rc.d mysql defaults

Copy after login

配置须知:

MySQL有大量可以修改的配置选项,通常只需要把基本的项配置正确,应该将更多的时间花在schema的优化、索引上,以及查询设计上。正确地配置MySQL的基本配置项后,再花力气去修改其他配置选项的收益通常就比较小了。
过度优化的服务器导致的潜在风险很大,容易频繁崩溃、运行缓慢。
MySQL大多数默认配置选项已经是最佳配置了,所以最好不要做太多的改动,上文设置的参数对于大多数人已经够多了。
没有一劳永逸的配置,随着数据库内数据、用户数量的变化,过一段时间后,可以有选择地调整数据库的配置。
基本配置选项详解:

socket = /tmp/mysql.sock
pid_file = /data/logs/mysql/mysql.pid

Copy after login

socket和pid_file 文件如果不指定位置,放在默认编译位置,在不同的MySQL版本里可能会导致一些错误

default_storage_engine = InnoDB
Copy after login

设定默认存储引擎,创建表的时候最好显式进行存储引擎的配置

innodb_buffer_pool_size = 2G
innodb_log_file_size = 128M
innodb_file_per_table = 1
innodb_flush_method = 0_DIRECT

Copy after login

InnoDB最重要的两个选项为缓冲池大小
innodb_buffer_pool_size和 日志文件大小innodb_log_file_size,默认值一般都太小。

如果大部分表都是InnoDB表,InnoDB缓冲池的设置或许比其他任何东西都需要内存。InnoDB并不仅仅缓存索引:它还会缓存数据、自适应哈系索引、插入缓冲(Insert Buffer)、锁,以及其他内部数据结构。InnoDB还使用缓冲池来帮助延迟写入,合并多个写入操作,一起顺序写回。总之,InnoDB严重依赖缓冲池,必须分配足够内存。

Note:
缓冲池越大,预热和关闭都需要很长时间。

InnoDB使用日志来减少事务提交的开销。因为日志已经记录了事务,就无须在每个事务提交时把缓冲池的胀快刷新到磁盘中。InnoDB用日志把随机I/O变成顺序I/O。一旦日志安全写到磁盘,事务就持久化了。如果断电,InnoDB可以重放日志并且恢复已经提交的事务。
整体日志大小受控于innodb_log_file_size和innodb_log_file_in_group两个参数之乘积。一般需要设置几百MB甚至上GB。作为经验法则,一般日志文件全部大小,应该足够容纳服务器一小时的活动内容。

缓冲池大小设置方法:
从服务器总内存开始
减去操作系统占用内存和其他服务占用内存(如果还有其他服务的话)
减去MySQL自身需要内存,例如为每个查询操作分配一些缓冲。
减去足够让操作系统缓存InnoDB日志文件的内存,至少是足够缓存最近经常访问的部分。再减去一些可以缓存二进制日志的最后一部分,以防止复制产生了延迟,备库可能读取主库上旧的二进制日志文件,给主库内存造成压力。
减去其他MySQL缓冲和缓存需要的内存,如MyISAM键缓存(key_buffer_size),或者查询缓存(query cache)
处以105%,向下取舍一个合理值。

Note:设置不需要很精确,而且宁可谨慎,而不要设置过大,如果设置少了20%可能只产生很小的影响,但是如果大了20%则可能造成很严重的问题:内存交换、磁盘抖动、内存耗尽和死机。

#MyISAM
key_buffer_size = 128M

Copy after login

MyISAM自身只缓存索引,不缓存数据(依赖操作系统缓存数据)。如果大部分为MyISAM表,就应该分配较大key_buffer_size。
再分配多大内存前,首先了解一下,MyISAM占用了多大的空间,肯定不需要分配比需要缓存的索引数据还大的内存(有时候为数据量扩增预留一些,会设置比较大)。
有两个方法计算索引大小:
使用SQL语句,查询INFORMATION——SCHEMA表的INDEX_LENGTH字段,把他们相加即可。

SELECT SUM( INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MYISAM';
Copy after login

使用的UNIX系统,则使用以下命令

# du -sch `find /mysqldatadir -name “*.MYI”`
Copy after login

键缓存需要存储多大的值?
不要超过索引总大小,也不要超过为操作系统缓存保留的总大小。取两者较小值。

缓冲区使用率计算,通过SHOW STATUS和SHOW VARIABLES命令查看以下变量:

100 - ( ( Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )
Copy after login

如果服务器运行很长一段时间之后,还是没有使用完所有缓冲键,就可以把缓冲键调小一点。

键缓冲命中率
从经验上来讲,每秒未命中次数更有用,假定一个磁盘每秒可以产生100个随机读,每秒5次缓存未命中则不会导致I/O繁忙,每秒80次则可能导致I/O繁忙。计算公式:

Key_reads / Uptime

Copy after login

设定默认字符集和编码

# character-set-server
character-set-server=utf8
collation-server=utf8_general_ci
Copy after login

以下选项设定仅使用IP来链接MySQL服务器,省略了DNS查询时间
阅读材料:http://dev.mysql.com/doc/refman/5.6/en/host-cache.html

# name-resolve
skip-name-resolve
skip-host-cache
Copy after login

设定错误日志和慢查询日志。大于1s的为慢查询

# LOG
log_error = /data/logs/mysql/mysql-error.log
long_query_time = 1
slow_query_log
slow_query_log_file = /data/logs/mysql/mysql-slow.log

# Others
#timestamp默认设置,5.6.6后不设置会报错
explicit_defaults_for_timestamp=true

Copy after login

设定同时处理的最大链接,保证应用激增产生而不堪重负,当查询不能执行,那打开一个链接没有任何好处,所以被“太多链接”的错误拒绝是一个快速而代价下的失败方式。具体设定需要参考预想的最大并发数和本机配置。

max_connections = 500

Copy after login

table_open_cache was known as table_cache in MySQL 5.1.2 and earlier.
table_open_cache应该设置足够大,避免总是重新打开和解析表定义。如果Open_tables的值每秒变化很大,那么table_open_cache可能设置偏小。这个值从max_connections的10倍开始设置比较好,但是,大部分情况下不要超过10000.

table_open_cache = 5000
Copy after login

如果在段时间内不断有错误链接,比如:权限错误,应用配置出错等。客户端达到max_connect_errors设定次数,就会被加入黑名单,无法连接,直到再次刷新主机缓存。(如何操作?)可以有效防止暴力破解密码。

max_connect_errors = 2000
Copy after login

在典型的Linux系统上我们把open_files_limit设置的尽可能大。现代操作系统中打开文件句柄开销都较小。如果这个参数设置不够大,会出现经典的24号错误:”too many open files”。

open_files_limit = 65535
Copy after login

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact [email protected]
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!