部分参考来自网络。
一、异步复制基本原理:
从MySQL3.23.15以后,MySQL支持单向的异步复制。也就是说,1台MySQL服务器充当Master(主库),1台或多台MySQL服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于MySQL的同步复制实现(这种实现称做MySQL集群,MySQL Cluster)。
当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Binlog),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。
有几个关键性的地方需要注意:
- 主库必须启用Bin log,主库和从库必须有唯一的Server Id
- 从库必须清楚了解从主库的哪一个Bin log文件的哪一个偏移位置起开始复制
- 从库可以从主库只复制指定的数据库,或者数据库的某些数据表
- 主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称
- 主库和从库的MySQL版本需保持一致
二、安装:
1、下载相关压缩包,从5.5开始mysql开始使用cmake编译安装。
2、下载cmake压缩包,编译安装。
# tar zxvfcmake-2.8.12.2.tar.gz
# cdcmake-2.8.12.2
#.configure
# make&& make install
3、安装mysql,开始时下载的是如下选项,用cmake编译时出现异常:
CMake Error: The source directory “*” does not appear to contain CMakeList
重新下载源码包:
4、创建相关安装目录
Mysql安装目录:
mkdir -p/usr/local/mysql/
数据存放目录
mkdir -p/data/mysql/
5、创建用户和用户组与赋予数据存放目录权限
groupadd mysql
useradd -g mysqlmysql
chownmysql.mysql -R /data/mysql/
6、编译。使用编译配置信息如下(注意utf8_general_ci不要写错。网上有些错的):
cmake .-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1\-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all\-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DMYSQL_USER=mysql \-DWITH_DEBUG=0
7、安装:make && make install
8、复制配置文件:
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server/etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
9、初始化数据库:
cd /usr/local/mysql
bash scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/data/mysql/
注意上面命令的空格和拼写。
10、启动mysql服务:
/etc/init.d/mysqldstatus (查看状态)
/etc/init.d/mysqldstart (启动服务)
(设置root密码)
/usr/local/mysql/bin/mysqladmin-u root password '123456'
11、 配置自启动和环境变量:
echo"/usr/local/mysql/bin/mysqld_safe --user=mysql &">>/etc/rc.local
echo"export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
source/etc/profile
12、 问题:[root@localhost mysql]# service mysql start
Starting MySQL.. ERROR! The server quit without updating PID file(/var/lib/mysql/localhost.localdomain.pid).
类似问题,大部分的答案都是:
1. 注释/etc/my.cnf里的skip-federated注释掉即#skip-federated;
2. my.cnf文件配置过高,重新定义其中的参数(根据服务器情况定义);
3. 杀掉mysql_safe和mysqld进程,然后再重启;
4. 当前日志文件过大,超出了my.cnf中定义的大小(默认为64M),删除日志文件再重启;
5. 其他情况,查看日志文件(我的是localhost.localdomain.err,具体因人而异),然后具体分析;
我采用了第二条问题解决。
三、配置异步复制:
1、修改 slav 服务器的 server-id(master 服务器不变)
/etc/my.cnf
server-id = 10
2、授权(在 master 服务器上操作)
mysql> GRANTREPLICATION SLAVE ON *.*
-> TO'backup'@'192.168.0.102' IDENTIFIED BY 'backup';
Query OK, 0 rowsaffected (0.00 sec)
mysql> showmaster status; //主数据库状态,类似
+------------------+----------+--------------+------------------+
| File |Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000003 | 401 | | |
+------------------+----------+--------------+------------------+
3、配置 slave 服务器
mysql> changemaster to
->master_host='192.168.0.101',
->master_user='backup',
->master_password='backup',
->master_log_file='mysql-bin.000003',
->master_log_pos=401;
Query OK, 0 rowsaffected (0.00 sec)
mysql> startslave;
Query OK, 0 rowsaffected (0.00 sec)
查看一下同步状态:
mysql> showslave status\G
***************************1. row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:192.168.0.101
Master_User:replication
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000003
Read_Master_Log_Pos:401
Relay_Log_File: XXX-relay-bin.000002
Relay_Log_Pos:253
Relay_Master_Log_File:mysql-bin.000003
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:401
Relay_Log_Space:411
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
1 row in set(0.00 sec)
注意:slave_IO进程及 slave_SQL 进程都必须正常运行
四、测试验证:
主从复制测试:在master 数据库服务器上创建库和表,然后再插入记录,再登
陆到 slave 服务器,看是否也建立相一致的库和表以及记录。
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
mysql> use test_db;
Database changed
mysql> create table test_table(idint(5),name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test_table
-> values(01,aaa);
Query OK, 1 row affected (0.00 sec)
现在登录 slave 数据库服务器,看是否成功同步。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| test_db |
+--------------------+
4 rows in set (0.02 sec)
mysql> use test_db;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_table |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from test_table;
+------+--------+
| id | name |
+------+--------+
| 1 | aaa |
+------+--------+
1 row in set (0.00 sec)
OK,到此结束。
下次研究一下半同步复制。