一、准备安装环境:

yum -yinstall make gcc- c++ cmake bison-devel ncurses-devel

二、下载mysql5.6.16

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

三、编译安装mysql

tar -xvzf mysql-5.6.16.tar.gz

cd mysql-5.6.16.tar.gz

cmake\

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/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 && make install


错误1

Googlemock was notfound. gtest-based unit tests will be disabled. You can run cmake .-DENABLE_DOWNLOADS=1 to automatically download and build required componentsfrom source.
– If you are inside a firewall, you may need touse an http proxy: export http_proxy=http://example.com:80

处理办法

使用参数-DENABLE_DOWNLOADS=1自动下载。

-DENABLE_DOWNLOADS=1

有网络限制,设置http代理

exporthttp_proxy=http://googlemock.googlecode.com:80

unzip source_downloads/gmock-1.6.0.zip

错误2

Warning: Bisonexecutable not found in PATH

处理办法

wget ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/5rolling/x86_64/SL/bison-2.3-2.1.x86_64.rpm

rpm –ivh bison-2.3-2.1.x86_64.rpm


重新编译

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql\

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/var/lib/mysql/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 \

-DENABLE_DOWNLOADS=1


make&& make install


四、配置MySQL

使用下面的命令查看是否有mysql用户及用户组

cat/etc/passwd 查看用户列表

cat/etc/group  查看用户组列表

如果没有就创建

groupaddmysql

useradd-g mysql mysql

修改/usr/local/mysql权限

chown-R mysql:mysql /usr/local/mysql

进入安装路径

cd/usr/local/mysql

进入安装路径,执行初始化配置脚本,创建系统自带的数据库和表

scripts/mysql_install_db--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data--user=mysql

注:在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc目录下找,找不到则会搜索"$basedir/my.cnf",在本例中就是/usr/local/mysql/my.cnf,这是新版MySQL的配置文件的默认位置!注意:在CentOS 6.4版操作系统的最小安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。


五、启动MySQL

添加服务,拷贝服务脚本到init.d目录,并设置开机启动

cpsupport-files/mysql.server /etc/init.d/mysql

chkconfigmysql on

servicemysql start  --启动MySQL

六、配置用户

MySQL启动成功后,root默认没有密码,我们需要设置root密码。

设置之前,我们需要先设置PATH,要不不能直接调用mysql

修改/etc/profile文件,在文件末尾添加

PATH=/usr/local/mysql/bin:$PATH

exportPATH

关闭文件,运行下面的命令,让配置立即生效

source /etc/profile

现在,我们可以在终端内直接输入mysql进入,mysql的环境了

执行下面的命令修改root密码

mysql -u root  

mysql> SET PASSWORD = PASSWORD('123456');

若要设置root用户可以远程访问,执行

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%'IDENTIFIED BY 'challenger' WITH GRANT OPTION;

红色的password为远程访问时,root用户的密码,可以和本地不同。

七、配置防火墙

防火墙的3306端口默认没有开启,若要远程访问,需要开启这个端口

打开/etc/sysconfig/iptables

在“-A INPUT –m state --state NEW –m tcp –p–dport 22 –j ACCEPT”,下添加:

-A INPUT m state --state NEW m tcp p dport3306 j ACCEPT

然后保存,并关闭该文件,在终端内运行下面的命令,刷新防火墙配置:

service iptables restart


八、错误汇总

错误1

Starting MySQL...ERROR! The server quit without updating PID file

处理1:

skip-locking不采用此参数。

错误2:

“[Warning] TIMESTAMP with implicit DEFAULTvalue is deprecated.Please use --explicit_defaults_for_timestamp server option(see documentation for more details).”

处理2:

[mysqld]

explicit_defaults_for_timestamp = 1

错误3:


处理3:

table_cache = 614K 不采用此参数。


九、参数优化:

[client]

port=3306

socket=/var/lib/mysql/mysql.sock

default-character-set = utf8


[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

explicit_defaults_for_timestamp=1


port=3306

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/var/lib/mysql/mysql.sock

user=mysql


log_slave_updates=1

log_bin=/usr/local/mysql/mysql-test/suite/binlog/mysql-bin

binlog_format=mixed

binlog_cache_size=4M

max_binlog_cache_size=8M

max_binlog_size=1G

expire_logs_days=90

binlog-ignore-db=mysql

binlog-ignore-db=test

binlog-ignore-db=information_schema



key_buffer_size = 512M

sort_buffer_size = 16M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

join_buffer_size = 16M

thread_cache_size = 128M

query_cache_size = 128M

#query_cache_limit=2M

#query_cache_min_res_unit=2K

thread_concurrency = 16



#table_cache=614

table_open_cache=512

open_files_limit=10240

#back_log=384

back_log=600

max_connections = 5000

max_connect_errors = 6000

external-locking=FALSE



max_allowed_packet = 32M

default-storage-engine = InnoDB

thread_stack = 512K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 256M

max_heap_table_size = 512M


bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

#myisam_max_extra_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover


long_query_time=2

slow_query_log

slow_query_log_file=/usr/local/mysql/slow.log

#skip-locking

#skip-networking


innodb_additional_mem_pool_size = 64M

innodb_buffer_pool_size = 6G

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 512M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table=0



wait_timeout=10

tmp_table_size = 128M

default-time-zone = system

character-set-server = utf8



[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid



[mysqldump]

quick

max_allowed_packet = 64M


[mysql]

no-auto-rehash

Remove the next comment character if you ar notfamiliar with SQL

safe -updates


[myisamchk]

key_buffer_size=256M

sort_buffer_size=256M

read_buffer=2M

write_buffer=2M


[mysqlhotcopy]

interactive-timeout



连接设置的优化


1、wait_timeout / interactive_timeout  连接超时

服务器关闭连接之前等待活动的秒数。MySQL所支持的最大连接数是有限的,因为每个连接的建立都会消耗内存,因此我们希望MySQL 处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。建议120 ~ 300

wait_timeout  指定一个请求的最大连接时间 wait_timeout = 10,对于4GB左右内存的服务器可以设置为5-10。

 

2、skip-name-resolve连接检查

skip-name-resolve参数用于禁止DNS的反向解析。MySQL默认开启了DNS的反向解析,当有新的连接到来时,MySQL会解析连接主机的DNS,这就影响了连接速度。使用该参数也有一个代价,就是每次连接都要使用ip地址,就不能再使用localhost,改成127.0.0.1

 

3、max_connections  最大连接进程数,也就是允许同时连接的客户数量

如果服务器的并发连接请求比较大,建议调高此值,以增加并行连接数量。但连接数越大,MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,服务器消耗的内存越多,可能会影响服务器性能,所以要根据服务器的配置适当调整该值,不能盲目提高设值。默认数值是100。【计算MySQL繁忙时处理连接的情况,建议值50% ~ 80%】max_used_connections / max_connections * 100%

 

4、max_connect_errors  最大连接错误数

max_connect_errors = 10000000。对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST;。

5、max_allowed_packet  设置最大包,限制server接受的数据包大小,避免超长SQL的执行有问题

默认值为16M,当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的信息包时,将发出“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与MySQL服务器的连接”错误。

增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。

6、thread_concurrency   允许通过的并发数 属重点优化参数

设置thread_concurrency的值的正确与否, 对mysql的性能影响很大, 在多个cpu(或多核)的情况下,错误设置了thread_concurrency的值, 会导致mysql不能充分利用多cpu(或多核), 出现同一时刻只能一个cpu(或核)在工作的情况。thread_concurrency应设为CPU核数的2倍. 比如有一个双核的CPU, 那么thread_concurrency的应该为4; 2个双核的cpu, thread_concurrency的值应为8。

 

7、back_log  设置MySQL能暂存的连接数量

当MySQL在一个很短时间内收到非常多的连接请求时起作用。如果MySQL的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。设定back_log高于你的操作系统的限制是无效的。当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,如果访问量大可以它改为500。默认数值是50。

缓存设置的优化

1、表缓存

相关参数: table_open_cache

  指定表缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值,如果发现open_tables等于table_cache,并且opened_tables在不断增长,那么就需要增加table_open_cache的值了。注意,不能盲目地把这个参数设置得很大,如果设置太大,会引起文件描述符不足,造成性能不稳定或者数据库连接失败。建议为512

  table_cache = 512指定表高速缓存的大小, 如果opened_tables太大,应该把table_cache变大。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables'获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

 

2、查询缓存

相关参数: query_cache_size / query_cache_type

  这个参数也是一个重要的优化参数。QC(注:查询缓存简称) 主要用来缓存 MySQL 中的 结果集,也就是一条SQL语句执行的结果集,所以仅仅只能针对select 语句。在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。

  但随着发展,这个参数也爆露出来一些问题。机器的内存越来越大,人们也都习惯性的把以前有用的参数分配的值越来越大。这个参数加大后也引发了一系列问题。我们首先分析一下 query_cache_size的工作原理:一个SELECT查询在DB中工作后,DB会把该语句缓存下来,当同样的一个SQL再次来到DB里调用时,DB在该表没发生变化的情况下把结果从缓存中返回给Client。这里有一个关建点,就是DB在利用Query_cache工作时,要求该语句涉及的表在这段时间内没有发生变更。那如果该表在发生变更时,Query_cache里的数据又怎么处理呢?首先要把Query_cache和该表相关的语句全部置为失效,然后在写入更新。那么如果Query_cache非常大,该表的查询结构又比较多,查询语句失效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了。所以在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建系把该功能禁掉。
    QC 的使用需要多个参数配合,其中最为关键的是 query_cache_size 和 query_cache_type ,前者设置缓存记录集的内存大小,后者设置在何场景下使用QC 。在以往的经验来看,中等规模的网站,query_cache_size 设置 256MB 足够了。当然,还可以通过计算QC的命中率来进行调整。

    Qcache_hits / (Qcache_hits + Qcache_inserts)  * 100%

  query_cache_type有三种选择:0(OFF,不使用QC),1(ON,默认使用QC ),2(DEMAND,默认不使用QC)。为什么加上“默认”?MySQL还支持动态使用缓存的SQL语法,如下:

  # 强制使用缓存    SELECT  SQL_CACHE  id  FROM  table

  # 强制不使用缓存  SELECT  SQL_NO_CACHE  id  FROM  table

 

在有些处理任务中,我们实际上是可以阻止查询缓存工作的。

 // query cache does NOT work
        $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
     // query cache works!
        $today = date("Y-m-d");
       $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

 

3、索引缓存

相关参数:key_buffer_size

  这个是对MyISAM表性能影响最大的一个参数,用来设置用于缓存 MyISAM存储引擎中索引文件的内存区域大小。如果有足够的内存,这个缓存区域大小可以设为所有的 MyISAM表的索引大小的总和,即 data 目录下所有*.MYI文件大小的总和。

  注意,由于 MyISAM 引擎只会缓存索引块到内存中,而不会缓存表数据库块。所以,查询SQL语句一定要尽可能让过滤条件都在索引中,以便使用到索引缓存来提高查询效率。

  计算索引缓存未命中的概率Key_reads / Key_read_requests * 100%

  如果Key_reads太大,则应该把key_buffer_size变大。增加它可得到更好处理的索引(对所有读和多重写),如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过检查状态值Key_read_requests和 Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%'获得)。注意:该参数值设置的过大反而导致是服务器整体效率降低。

 

4、插入缓存

相关参数:bulk_insert_buffer_size

  用于使用 MyISAM引擎,用来缓存批量插入数据的时候临时缓存写入数据。当我们使用如下几种数据写入语句的时候,会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件,默认8M,建议不要超过32M

insert … select …
insert … values (…),(…),(…),…
load data infile… into… /* 非空表 */

 

 5、日志缓存

相关参数:binlog_cache_size

  用于在打开了二进制日志(binlog)记录功能的环境中,是 MySQL 用来提高 binlog 的记录效率而设计的一个在短时间内缓存binlog 数据的内存缓存。

  如果数据库中没有大事务,写入不是特别频繁,2MB~4MB是一个合适的选择。但是如果数据库大事务较多,写入比较频繁,可适当加大。使用的时候,还可以通过  binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件来缓存了。

 

6、其他缓存参数设置

  1)、key_buffer  改变索引缓冲区长度

一般,该变量控制缓冲区的长度在处理索引表(读/写操作)时使用。MySQL使用手册指出该变量可以不断增加以确保索引表的最佳性能,并推荐使用与系统内存25%的大小作为该变量的值。这是MySQL十分重要的配置变量之一,如果你对优化和提高系统性能有兴趣,可以从改变 key_buffer_size变量的值开始。 

  2)、long_query_time 对缓长查询设定一个时间限制

MySQL带有“慢查询日志”,它会自动地记录所有的在一个特定的时间范围内尚未结束的查询。这个日志对于跟踪那些低效率或者行为不端的查询以及寻找优化对象都非常有用。long_query_time变量控制这一最大时间限定,以秒为单位。 

3)、sort_buffer_size   属重点优化参数

sort_buffer_size = 4M 查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 4 = 400MB。所以,对于内存在4GB左右的服务器推荐设置为4-8M。 

4)、read_buffer_size 读查询操作所能使用的缓冲区大小

read_buffer_size = 4M。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。 

5)、join_buffer_size  联合查询操作所能使用的缓冲区大小

  join_buffer_size = 8M,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。 

6)、thread_cache_size

thread_cache_size = 64服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,如果Threads_created太大,就要增加thread_cache_size的值。当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用 

7)、tmp_table_size

如果Created_tmp_disk_tables太大, 就要增加tmp_table_size的值,用基于内存的临时表代替基于磁盘的。tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,可以增加 tmp_table_size 值。 

8)、read_rnd_buffer_size

MySql的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。