mysql源码安装和主从复制的配置


mysql的主从复制(master-slave replication)可以实时备份mysql的数据,可以在一定程度上提高数据的安全性。

主从复制中的master必须打开binlog功能(数据库请求日志),因为mysql的主从复制实际上是slave请求master获取到binlog,然后在slave上重做的过程。

1.mysql源码安装

1)安装cmake,如果系统中没有的话

下载源码:http://www.cmake.org/cmake/resources/software.html

解压:

tar -xf cmake-2.8.12.2.tar.gz

进入cmake源码目录:

cd cmake-2.8.12.2

配置编译选项:

./configure

编译安装:

make
make install

2)安装mysql

下载mysql源码:http://dev.mysql.com/downloads/file.php?id=452276

新建mysql的程序目录和数据目录,假设我们要把mysql程序安装到/usr/local/services/mysql/,把数据存放在/usr/local/services/mysql_data/:

mkdir -p /usr/local/services/mysql/
mkdir -p /usr/local/services/mysql_data/

创建mysql专用的账户,并修改数据数据目录的owner:

groupadd mysql
useradd -gmysql mysql
chown mysql:mysql -R /usr/local/services/mysql_data

使用cmake配置编译选项:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/services/mysql -DSYSCONFDIR=/usr/local/services/mysql/etc -DMYSQL_DATADIR=/usr/local/services/mysql_data -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_USER=mysql -DEXTRA_CHARSETS=all -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1

编译,安装:

make
make install

使用默认的配置文件:

cd /usr/local/services/mysql/
cp support-files/my-default.cnf etc/my.cnf

安装基本数据库到数据目录:

./scripts/mysql_install_db --defaults-file=etc/my.cnf --basedir=/usr/local/services/mysql --datadir=/usr/local/services/mysql_data --user=mysql

启动mysql:

./bin/mysqld_safe --defaults-file=/usr/local/services/mysql/etc/my.cnf &

修改root用户的密码(这里是root):

./bin/mysqladmin -S /tmp/mysqld.sock -u root password 'root'

使用命令:

mysql -h127.0.0.1 -uroot -proot 

登录刚启动的mysql,修改用户数据,允许任何主机通过root用户访问该mysql实例(这一步可以根据自己的需要选择性操作):

mysql>use mysql; 
mysql>update user set host = '%' where user ='root'; 
mysql>delete from user where host <> '%'; 
mysql>flush privileges; 

设置主从复制

假设已经按照上述步骤,在两台服务器上安装好了mysql,尚未进行数据库写操作,按照下面的指示修改mysql的配置文件/usr/local/services/mysql/etc/my.cnf

#在[Mysqld]加入如下几行(以下带#号部分为参数的解释,不需要加入)
#跳过从库在行解析的relay-log日志中产生的错误,从而让从库可以继续更新
slave_skip_errors=1062,1032                       
#当Slave从Master数据库读取日志时将更新写入日志中
log_slave_updates
#不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址#进行
skip_name_resolve
#设置数据库的字符集
character_set_server=utf8
#设置binlog日志的记录形式为row
binlog_format=row
#修改master 主机的server-id=1 ,slave的server-id=2
#在master上增加:
log-bin=mysql-bin

重启两台机器上的mysql(使用kill -9 杀掉mysql进程,然后再用./bin/mysqld_safe --defaults-file=/usr/local/services/mysql/etc/my.cnf &命令启动)。

登录master的mysql,添加专门用于主从复制的账号:

 mysql> grant replication slave on *.* to 'replication'@'%' identified by 'replication';
 mysql> grant all privileges on *.* to replication@'%' identified by 'replication';
 mysql> flush privileges ;

然后:

  mysql> show master status ;

会显示master的状态,如下图所示:

master状态

说明master已经配置好,注意Position的值和File的值。

登录slave的mysql,设置master:

mysql>change master to master_host='192.168.1.1',master_port=3306,master_user='replication',master_password='replication',master_log_file='mysql-bin.000001',master_log_pos=712 ;
mysql> start slave ;

master_host请换成你的master的ip地址。这里的master_log_pos和master_log_file和上面master的状态中显示的一致。

然后使用show slave status\G;查看slave的状态,可以看到如下所示的输出:

slave状态

注意红色标出的地方,如果两个值都为Yes,说明配置成功了。

为有数据的master配置slave

上述的主从复制设置是为两台新装的mysql的配置主从复制关系,特点是master没有数据,如果master有数据,需要先锁master,禁止master的写做操,然后把master的数据文件拷贝到从服务器上,建立主从复制关系,然后再解锁master。

锁master:

mysql> FLUSH TABLES WITH READ LOCK;

复制master的数据文件到slave:将master的数据文件(整个/usr/local/services/mysql_data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压(注意不要拷贝auto.cnf)

按照“设置主从复制”中的步骤,建立主从复制关系(修改配置然后重启的操作,可以在锁master之前完成)。

解锁master:

UNLOCK TABLES;