1.mysql5.5.25编译安装部署,见:http://michaelkang.blog.51cto.com/1553154/935133
2.安装简介
2.1:安装环境
mysql.master:192.168.16.30
[root@testserver03 ~]# uname -a
Linux testserver03 2.6.32-279.2.1.el6.x86_64 #1 SMP Fri Jul 20 01:55:29 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@testserver03 ~]# more /etc/redhat-release
CentOS release 6.3 (Final)
内存:16G
CPU:Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
mysql.slave:192.168.16.31
[root@test04 ~]# uname -a
Linux test04 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@test04 ~]# more /etc/redhat-release
CentOS release 6.3 (Final)
内存:16G
CPU:Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
2.2:用户和目录环境
mysql.master:192.168.16.30
mysql.slave:192.168.16.31
用户名:mysql
安装目录:/mysql
数据库目录:/data/mysqldata
安装文件存放目录:/workspace
源码包:mysql-5.5.25.tar.gz
mysql密码 (123)
本地登录方式:
mysql -h 127.1 -u root –p123
3.修改主从服务器配置文件;
master 服务器配置文件如下:
[root@testserver03 ~]# more /etc/my.cnf
[client]
user = root
password = 123
port = 3306
socket = /tmp/mysqld.sock
[mysqld]
#character-set-server = utf8
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
user = mysql
port = 3306
socket = /tmp/mysqld.sock
basedir = /mysql
datadir = /data/mysqldata
log-error = /var/log/mysql_error.log
pid-file = /data/mysqldata/test04.pid
skip-external-locking = 0
expire_logs_days = 1
max_connect_errors = 6000
back_log = 600
max_connections = 5000
max_connect_errors = 200
table_open_cache = 2048
max_allowed_packet = 32M
binlog_cache_size = 1M
max_heap_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 300
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 = 2
server-id = 1
key_buffer_size = 64M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 6G
myisam_repair_threads = 1
myisam_recover
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 6G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
[mysqldump]
quick
max_allowed_packet = 16M
[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
slave 服务器配置文件如下:
[root@test04 ~]# more /etc/my.cnf
[client]
#character-set-server = utf8
user = root
password = 123
port = 3306
socket = /tmp/mysqld.sock
[mysqld]
#character-set-server = utf8
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
user = mysql
port = 3306
socket = /tmp/mysqld.sock
basedir = /mysql
datadir = /data/mysqldata
log-error = /var/log/mysql_error.log
pid-file = /data/mysqldata/test04.pid
skip-external-locking = 0
expire_logs_days = 1
max_connect_errors = 6000
back_log = 600
max_connections = 5000
max_connect_errors = 200
table_open_cache = 2048
max_allowed_packet = 32M
binlog_cache_size = 1M
max_heap_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 300
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 = 2
server-id = 2
key_buffer_size = 64M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 6G
myisam_repair_threads = 1
myisam_recover
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 6G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
[mysqldump]
quick
max_allowed_packet = 16M
[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
将修改完成的配置文件,上传到主备服务器,server id 主改为1 slave改为2.
配置文件改的匆忙,如果有不妥的地方,各位大侠看到,一定要指点一下!
主备服务器都成功启动后,下面正式开始配置互为主从。
1.
进入数据库,在 master 为辅库添加同步用户,在 slave上 为辅库添加同步用户;
在master上执行
grant replication slave on *.* to 'master'@'192.168.16.%' identified by '123';
flush privileges;
在slave上执行
grant replication slave on *.* to 'slave'@'192.168.16.%' identified by '123';
flush privileges;
2.测试账户有效性服务ID的唯一;
2.1
在master上执行
/mysql/bin/mysql -h 192.168.16.31 -u slave -pp123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 | #主备服务器id不能相同,如果相同无法进行日志同步。
+---------------+-------+
1 row in set (0.00 sec)
2.2
在slave上执行
/mysql/bin/mysql -h 192.168.16.30 -u master -p123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.00 sec)
3.锁住主库表,停止数据更新。
进入到mysql后输入
mysql> flush tables with read lock;
此时所有数据库内的表只提供读的操作,不能再写入。如果主数据库有大量数据,进行数据同步,把现有主库的数据导入到从库,数据导入完成.
4.首先配置主从模式;
4.1
在master上执行
查看一下库状态;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 | 107 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4.2
在slave上执行,配置需要同步的master服务器的相关信息;
change master to master_host='192.168.16.30',master_user='master', master_password='123',master_log_file='mysql-bin.000011',master_log_pos=107;
【注意】
192.168.16.30 ---masterDB的IP
master ---为主从同步需要的用户名及密码
mysql-bin.000011 ---在master上执行show master status的log文件名
107 ---需要同步的起点位置(在master上执行show master status得出该结果)
4.3.开启同步进程;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
4.4.查看只从同步状态;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.16.30
Master_User: master
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 107
Relay_Log_File: test04-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000011
Slave_IO_Running: Yes #这两个值为yes只从同步正常;
Slave_SQL_Running: Yes #
mysql> show processlist; 查看日主同步,复制情况;
|
| 19 | system user | | NULL | Connect | 229 | Waiting for master to send event #提示等待从master上发送日志 |
4.5
在master上执行,数据库解锁。
unlock tables;
5.测试主从同步;
5.1.在master建立pttest库;
mysql> create database pttest;
Query OK, 1 row affected (0.00 sec)
5.2
在slave上查看;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| pttest | #主库上新建的表,已经同步过来!
| test |
+--------------------+
5 rows in set (0.00 sec)
6.开始配置互为主从;
6.1
在slave上执行
mysql -h 127.1 -u root -p123 登录slave 数据库;
6.2.锁住主库表,停止数据更新。
进入到mysql后输入
mysql> flush tables with read lock;
查看一下库状态;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 107 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
6.3.
在master上执行
change master to master_host='192.168.16.31',master_user='slave', master_password='p123',master_log_file='mysql-bin.000005',master_log_pos=107;
【注意】
192.168.16.31 ---slaveDB的IP
master ---为主从同步需要的用户名及密码
mysql-bin.000005 ---在master上执行show master status的log文件名
107 ---需要同步的起点位置(在master上执行show master status得出该结果)
6.4.开启同步slave进程;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
6.5.查看只从同步状态;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.16.30
Master_User: master
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 107
Relay_Log_File: test04-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000011
Slave_IO_Running: Yes #这两个值为yes只从同步正常;
Slave_SQL_Running: Yes #
mysql> show processlist; 查看日主同步,复制情况;
|
| 19 | system user | | NULL | Connect | 229 | Waiting for master to send event #呵呵,你懂得! |
6.6
在slave上执行,数据库解锁。
unlock tables;
7.测试主从同步;
7.1.在master建立pttest库;
mysql> create database slavetest;
Query OK, 1 row affected (0.00 sec)
7.2
在master上查看;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slavetest | #主库上新建的表,已经同步过来!
| test |
+--------------------+
5 rows in set (0.00 sec)
8.互为主从测试;
在主服务器上建立mysqltest数据库,分别在mysql和slave上进行数据插入和查询,得到结果始终保持一致;
8.1
在master上执行;
编辑创建数据库和表的脚本
SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS mysqltest;
USE mysqltest;
CREATE TABLE IF NOT EXISTS sbook (
id INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT
,name varchar(20) NOT NULL DEFAULT 'change_name_here'
,gender ENUM('M', 'F', 'U') NOT NULL DEFAULT 'M'
,birthday DATE NOT NULL DEFAULT '0000-00-00'
);
SHOW TABLES;
SELECT * FROM sbook;
8.2
master 上数据插入;
USE mysqltest;
INSERT INTO sbook ( name, gender, birthday ) VALUES ('tubie', 'F', '2010-07-15');
INSERT INTO sbook VALUES ( '', 'haolei', 'M', '2010-05-25' );
8.3
master 上查看sbook表内容;
mysql> SELECT * FROM sbook;
+----+--------+--------+------------+
| id | name | gender | birthday |
+----+--------+--------+------------+
| 1 | tubie | F | 2010-07-15 |
| 2 | haolei | M | 2010-05-25 |
+----+--------+--------+------------+
2 rows in set (0.00 sec)
8.4
slave数据库上查看mysqltest库和sbook表内容;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysqltest |#数据库已经生成;
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use mysqltest;
Database changed
mysql> select * from sbook;
+----+--------+--------+------------+
| id | name | gender | birthday |
+----+--------+--------+------------+
| 1 | tubie | F | 2010-07-15 |
| 2 | haolei | M | 2010-05-25 | #表内容一致;
+----+--------+--------+------------+
2 rows in set (0.00 sec)
8.5
在slave上插入数据,然后再master上查看,验证数据是否一致;
8.6
slave 上数据插入;
USE mysqltest;
INSERT INTO sbook ( name, gender, birthday ) VALUES ('tubie', 'F', '2010-07-15');
INSERT INTO sbook VALUES ( '', 'haolei', 'M', '2010-05-25' );
8.7
slave 上查看sbook表内容;
mysql> SELECT * FROM sbook;
+----+--------+--------+------------+
| id | name | gender | birthday |
+----+--------+--------+------------+
| 1 | tubie | F | 2010-07-15 |
| 2 | haolei | M | 2010-05-25 |
| 3 | tubie | F | 2010-07-15 |
| 4 | haolei | M | 2010-05-25 |
| 5 | tubie | F | 2010-07-15 |
| 6 | haolei | M | 2010-05-25 |
| 7 | tubie | F | 2010-07-15 |
| 8 | haolei | M | 2010-05-25 |
+----+--------+--------+------------+
8 rows in set (0.00 sec)
8.8
master上查看sbook表内容;
mysql> SELECT * FROM sbook;
+----+--------+--------+------------+
| id | name | gender | birthday |
+----+--------+--------+------------+
| 1 | tubie | F | 2010-07-15 |
| 2 | haolei | M | 2010-05-25 |
| 3 | tubie | F | 2010-07-15 |
| 4 | haolei | M | 2010-05-25 |
| 5 | tubie | F | 2010-07-15 |
| 6 | haolei | M | 2010-05-25 |
| 7 | tubie | F | 2010-07-15 |
| 8 | haolei | M | 2010-05-25 |
+----+--------+--------+------------+
8 rows in set (0.00 sec)
结论:分别在主数据库和从数据库上进行数据插入,分别查询表内容,主从库上内容始终保持一致,互为主从功能实现;