一、源码安装mysql5.6.20

1.编译环境安装

yum install wget gcc* make openssl openssl-devel openssl-clients -y && yum groupinstall " Development tools" -y

2.×××(软件见Linux部署源码包)

wget -P /usr/local/src/ http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.20.tar.gz

wget -P /usr/local/src/ http://down1.chinaunix.net/distfiles/cmake-2.8.10.2.tar.gz

3.源码安装cmake编译环境

cd /usr/local/src/ && tar xf cmake-2.8.10.2.tar.gz

cd cmake-2.8.10.2 && ./configure --prefix=/usr/local/cmake && make && make install 

4.源码安装mysql-5.6.20

groupadd mysql

useradd -r -g mysql -s /etc/nologin mysql  #(创建mysql用户不需要密码和登录系统)

mkdir -p /home/mysql/data && mkdir /home/mysql/var #

cd /usr/local/src/ && tar xf mysql-5.6.20.tar.gz

cd mysql-5.6.20 

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/home/mysql/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/home/mysql/var/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make && make install

环境变量配置

vim /etc/profile

在末行添加export PATH=$PATH:/usr/sbin/:/usr/local/mysql/bin

保存退出执行:source /etc/profile


5.初始化数据库

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/home/mysql/data --user=mysql --default-storage-engine=MyISAM


6.配置启动脚本

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

chmod +x /etc/init.d/mysql

chkconfig --add mysql && chkconfig mysql on

二、mysql主从复制设置

1.主mysql配置文件my.cnf

=====================================================

[client]

default-character-set=utf8

#auto-rehash

socket = /home/mysql/var/mysql.sock

[mysqld]

slave-skip-errors=1022,1032,1062

skip-name-resolve

basedir = /usr/local/mysql

datadir = /home/mysql/data

socket = /home/mysql/var/mysql.sock

character-set-server=utf8

collation-server=utf8_general_ci

back_log = 300

max_connections = 5000

max_connect_errors = 30

table-definition-cache=2000

table-open-cache=4000

max_allowed_packet = 32M


max_heap_table_size = 128M

sort_buffer_size = 16M

join_buffer_size = 16M

#thread_cache_size = 16

#thread_concurrency = 8

query_cache_size = 128M

query_cache_limit = 4M

ft_min_word_len = 8

default-storage-engine=MYISAM

thread_stack = 512K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 128M

slow-query-log

long_query_time = 6


#master config

# grant replication slave, replication client on *.* to 'root'@'192.168.1.131' identified by 'password';

# ref : http://blog.csdn.net/seteor/article/details/17261733

server-id = 1

log-bin=mysqlmaster-bin

#binlog-do-db = cad #指定需要进行主从的数据库

binlog_cache_size = 4M

binlog_format=mixed

expire_logs_days=3

#binlog-ignore-db=test #不记录test库的binlog

#replicate-ignore-db=test #不复制test库的binlog

sync_binlog=1

sql_mod=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names=1


#slave config

#server_id=2

#binlog-do-db = cad

#binlog-ignore-db=test #不记录test库的binlog

#replicate-ignore-db=test #不复制test库的binlog

#log-bin=mysql-bin

#binlog_cache_size = 1M

#binlog_format=mixed

#expire_logs_days=3


key_buffer_size = 128M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

skip-federated


#innodb config

innodb_additional_mem_pool_size = 64M

innodb_buffer_pool_size = 512M

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 1

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


[mysqldump]

quick

max_allowed_packet = 32M


[mysql]

no-auto-rehash


[isamchk]

key_buffer = 2048M

sort_buffer_size = 2048M

read_buffer = 32M

write_buffer = 32M


[myisamchk]

key_buffer = 2048M

sort_buffer_size = 2048M

read_buffer = 32M

write_buffer = 32M


[mysqlhotcopy]

interactive-timeout


[mysqld_safe]

open-files-limit = 8192

=====================================================

2.从mysql配置文件my.cnf

=====================================================

[client]

default-character-set=utf8

#auto-rehash

socket = /home/mysql/var/mysql.sock

[mysqld]

slave-skip-errors=1022,1032,1062

skip-name-resolve

basedir = /usr/local/mysql

datadir = /home/mysql/data

socket = /home/mysql/var/mysql.sock

character-set-server=utf8

collation-server=utf8_general_ci

back_log = 300

max_connections = 5000

max_connect_errors = 30

table-definition-cache=2000

table-open-cache=4000

max_allowed_packet = 32M


max_heap_table_size = 128M

sort_buffer_size = 16M

join_buffer_size = 16M

#thread_cache_size = 16

#thread_concurrency = 8

query_cache_size = 128M

query_cache_limit = 4M

ft_min_word_len = 8

default-storage-engine=MYISAM

thread_stack = 512K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 128M

slow-query-log

long_query_time = 6


#master config

# grant replication slave, replication client on *.* to 'root'@'192.168.1.131' identified by 'password';

# ref : http://blog.csdn.net/seteor/article/details/17261733

#server-id = 1

#log-bin=mysql-bin

#binlog_cache_size = 4M

#binlog_format=mixed

#expire_logs_days=3

#binlog-ignore-db=test

#replicate-ignore-db=test


#slave config

server_id=2

#binlog-do-db = cad #指定需要做主从的数据库,如果不指定则默认全库主从

#binlog-ignore-db=test #不记录binlog

#replicate-ignore-db=test #不复制test库的binlog

log-bin=mysqlslave-bin

binlog_cache_size = 1M

binlog_format=mixed

expire_logs_days=3

sync_binlog=1

key_buffer_size = 128M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

skip-federated

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names=1


#innodb config

innodb_additional_mem_pool_size = 64M

innodb_buffer_pool_size = 512M

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 1

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


[mysqldump]

quick

max_allowed_packet = 32M


[mysql]

no-auto-rehash


[isamchk]

key_buffer = 2048M

sort_buffer_size = 2048M

read_buffer = 32M

write_buffer = 32M


[myisamchk]

key_buffer = 2048M

sort_buffer_size = 2048M

read_buffer = 32M

write_buffer = 32M


[mysqlhotcopy]

interactive-timeout


[mysqld_safe]

open-files-limit = 8192

=====================================================

3.启动主从数据库并将其加入开启自启动项

service mysql start

chkconfig mysql on 

chkconfig --list mysql #查看mysql的开机项设置

4.主从配置(参考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26267891&id=3856859)

                  http://www.linuxidc.com/Linux/2014-06/103752.htm

 4.1 主mysql服务器创建同步的账号:(ip地址从mysql所属IP)

 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.124.156.237' IDENTIFIED BY 'yzkj2015';

 Query OK, 0 rows affected (0.13 sec)

 mysql> flush privileges;

 4.2 主mysql服务器查看master状态,获取二进制日志名和偏移量

  mysql> show master status\G

  *************************** 1. row ***************************

               File: mysqlmaster-bin.000004

           Position: 396

       Binlog_Do_DB: 

   Binlog_Ignore_DB: 

  Executed_Gtid_Set: 

  1 row in set (0.00 sec)

  

 (备注:show master status\G; 报错ERROR: No query specified 属于语法错误)

 4.3 主mysql停止数据库操作,对数据库进行导出操作,然后导入到从mysql

  #首先添加一个读锁保证数据库的一致性

  mysql> flush tables with read lock;

  mysql> quit;

  mysqldump -h127.0.0.1 -uroot -p -P 3306 --all-databases --triggers --routines --events> /opt/all.sql  

  #最后恢复Master机器的读锁

  mysql> unlock tables;

 4.4 从mysql进行数据导入(mysqldump可以在从服务器做:-h master_ip)

  mysql -uroot -p -h127.0.0.1 -P3306 < /opt/all.sql

 4.5 在从mysql服务器上设置数据同步的数值,该步一些参数是从4.1和4.2得到的

  mysql> change master to master_host = '10.124.165.254',master_user='slave',master_password='yzkj2015',master_log_file='mysqlmaster-bin.000004',master_log_pos=396;

 4.6 启动从数据库复制线程,并查询从数据库的复制线程状态

  mysql> start slave;

  Query OK, 0 rows affected (0.01 sec)

  mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.124.165.254

                  Master_User: slave

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysqlmaster-bin.000004

          Read_Master_Log_Pos: 1021

               Relay_Log_File: mysql_S-relay-bin.000005

                Relay_Log_Pos: 914

        Relay_Master_Log_File: mysqlmaster-bin.000004

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

          Replicate_Ignore_DB: 

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 1021

              Relay_Log_Space: 1259

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 1

                  Master_UUID: 709e2dcf-0b51-11e5-9754-286ed489d502

             Master_Info_File: /home/mysql/data/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 

            Executed_Gtid_Set: 

                Auto_Position: 0

1 row in set (0.00 sec)

 

  查询结果中:Slave_IO_Running: Yes  同时出现才证明主从设置成功

             Slave_SQL_Running: Yes 


三、多主一从类型的主从设置

 1.背景介绍:

   公司线上跑着多个业务型mysql数据库,最初考虑的是避免有很多连锁反应的数据库崩溃,于是就有了多个数据库同时进行主从热备的需求。这里采用mysql数据库本身自带的一种多实例数据库设置。具体的安装请参照第一部分进行编译安装,下面我将从初始化到多实例数据库的启动开始写起。

 2.多实例数据库的初始化

   2.1 创建多实例数据目录

   mkdir -p /home/mysql/data/data_3306/ /home/mysql/data/data_3306/socket

   mkdir -p /home/mysql/data/data_3307/ /home/mysql/data/data_3307/socket

   mkdir -p /home/mysql/data/mysqld_multi_logs

   chown –R mysql.mysql /home/mysql/

   2.2 my.cnf配置文件

======================================

[mysqld_multi]

mysqld = /usr/local/mysql/bin/mysqld_safe

mysqladmin = /usr/local/mysql/bin/mysqladmin

log = /home/mysql/data/mysqld_multi_logs/mysqld_multi.log

#user = root

#password = password

[mysqld1]

socket = /home/mysql/data/data_3306/socket/mysql.sock

port = 3306

pid-file = /home/mysql/data/data_3306/3306.pid

datadir = /home/mysql/data/data_3306

user = mysql

skip-name-resolve

lower_case_table_names=1

innodb_file_per_table=1

back_log = 50


max_connections = 300

max_connect_errors = 1000

table_open_cache = 2048

max_allowed_packet = 16M

binlog_cache_size = 2M

max_heap_table_size = 64M

sort_buffer_size = 2M

join_buffer_size = 2M

thread_cache_size = 64

thread_concurrency = 8

query_cache_size = 64M

query_cache_limit = 2M

ft_min_word_len = 4

default-storage-engine = MYISAM

thread_stack = 192K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 64M

log-bin=mysqlslave-bin

binlog_format=mixed

slow_query_log

long_query_time = 1


#slave

server_id=2

#binlog-do-db = cad

#binlog-ignore-db=test #不记录binlog

#replicate-ignore-db=test #不复制test库的binlog

log-bin=mysqlslave-bin

binlog_cache_size = 1M

binlog_format=mixed

expire_logs_days=3

sync_binlog=1

key_buffer_size = 128M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

skip-federated

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names=1


#innodb config

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 200M

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 8

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 1

innodb_log_buffer_size = 16M

innodb_log_file_size = 512M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 60

innodb_lock_wait_timeout = 120


[mysqld2]

socket = /home/mysql/data/data_3307/socket/mysql.sock

port = 3307

pid-file = /home/mysql/data/data_3307/3307.pid

datadir = /home/mysql/data/data_3307

user = mysql

skip-name-resolve

lower_case_table_names=1

innodb_file_per_table=1

back_log = 50

max_connections = 300

max_connect_errors = 1000

table_open_cache = 2048

max_allowed_packet = 16M

binlog_cache_size = 2M

max_heap_table_size = 64M

sort_buffer_size = 2M

join_buffer_size = 2M

thread_cache_size = 64

thread_concurrency = 8

query_cache_size = 64M

query_cache_limit = 2M

ft_min_word_len = 4

default-storage-engine = MYISAM

thread_stack = 192K

transaction_isolation = REPEATABLE-READ

tmp_table_size = 64M

log-bin=mysql-bin

binlog_format=mixed

slow_query_log

long_query_time = 1


#slave

server_id=2

#binlog-do-db = cad

#binlog-ignore-db=test #不记录binlog

#replicate-ignore-db=test #不复制test库的binlog

log-bin=mysqlslave-bin

binlog_cache_size = 1M

binlog_format=mixed

expire_logs_days=3

sync_binlog=1

key_buffer_size = 128M

read_buffer_size = 8M

read_rnd_buffer_size = 64M

bulk_insert_buffer_size = 256M

myisam_sort_buffer_size = 256M

myisam_max_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

skip-federated

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

lower_case_table_names=1


#innodb config

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 200M

innodb_data_file_path = ibdata1:10M:autoextend

innodb_file_io_threads = 8

innodb_thread_concurrency = 16

innodb_flush_log_at_trx_commit = 1

innodb_log_buffer_size = 16M

innodb_log_file_size = 512M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 60

innodb_lock_wait_timeout = 120


[mysqldump]

quick

max_allowed_packet = 256M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 512M

sort_buffer_size = 512M

read_buffer = 8M

write_buffer = 8M

[mysqlhotcopy]

interactive-timeout

[mysqld_safe]

open-files-limit = 8192

============================================

  2.3 多实例初始化

  /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/home/mysql/data/data_3306 --user=mysql --default-storage-engine=MyISAM

  /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/home/mysql/data/data_3307 --user=mysql --default-storage-engine=MyISAM

 3. 多实例数据库的启动与关闭

  mysqld_multi start 1,2

  mysqld_multi stop 1,2

 4. 数据库的连接

  1)本地连接:

    mysql -S /home/mysql/data/data_3306/socket/mysql.sock  #第一个实例连接

    mysql -S /home/mysql/data/data_3307/socket/mysql.sock  #第二个实例连接

  2)远程连接:

    mysql –h10.124.156.237 –P 3306 –u root –p  #指定端口号连接

    mysql –h10.124.156.237 –P 3307 –u root –p


   

参考连接:MySQL启多个实例 http://www.cnblogs.com/acpp/archive/2010/08/09/1795466.html

 http://blog.chinaunix.net/uid-20639775-id-3438560.html

   

四、问题解决(参照err日志)

 1. Slave_IO_Running: NO 

   Slave_SQL_Running: Yes

   mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。

   出现上面所述情况,可能有三种情况:1)网络有问题,连接不上;2)配置my.cnf可能有问题;3)授权的问题,replication slave和file权限是必须的。

   详情参照:http://www.jb51.net/article/27220.htm

   我这里遇到的问题是在二 4.5步骤上少输入一个参数:master_password='yzkj2015'

 2. Slave_IO_Running: connecting

   Slave_SQL_Running: Yes

   导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:    

   1)、网络不通  

   2)、密码不对  

   3)、pos不对

   可以参考这个连接:http://blog.csdn.net/i_bruce/article/details/17055135

   我这里出现的原因是在my.cnf文件中没有使用这个参数:

    [mysqld]

    skip-name-resolve

   所以导致数据库远程连接过慢,一直处于一个正在连接的状态。

   参考这个连接:解决远程连接mysql很慢的方法(mysql_connect 打开连接慢) http://www.jb51.net/article/27616.htm

 3./usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8' 

  在解决一些问题的时候,我们会去查看一下日志文件,这样就使用mysqlbinlog命令。可惜遇到上述问题,原因是我在my.cnf配置文件中设置了这个参数:

  [mysqld]

  default-character-set=utf8

  解决的方法就是利用执行mysqlbinlog文件的时候只检查my.cnf文件,而我们修改my.cnf文件之后不重启是不会生效的,所以临时修改my.cnf文件将上述参数临时注释掉,但最后执行完命令之后不要忘记再修改回来。

  具体参照连接:mysqlbinlog 查看mysql bin 日志 http://blog.csdn.net/gnufre/article/details/6955169

  连接中提到的第二种方法没有实现