1.实验环境

 1.1系统环境

      主库名:master,ip地址:192.168.4.44;从库名:Nodes03,ip地址:192.168.4.150。


1.2确认已安装mysql

[root@master ~]# rpm -qa | grep mysql 主库确认
mysql-5.1.69-1.el6_4.i686
mysql-libs-5.1.69-1.el6_4.i686
mysql-server-5.1.69-1.el6_4.i686
[root@Nodes03 ~]# rpm -qa | grep mysql 从库确认
mysql-5.1.69-1.el6_4.i686
mysql-libs-5.1.69-1.el6_4.i686
mysql-server-5.1.69-1.el6_4.i686


1.3设置开机启动

[root@master ~]# chkconfig --list mysqld
mysqld 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@master ~]# chkconfig --level 2345 mysqld on
[root@Nodes03 ~]# chkconfig --list mysqld
mysqld 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@Nodes03 ~]# chkconfig --level 2345 mysqld on

     主从上的mysql版本需要一致。


1.4主从复制原理简说

       msyql的主从复制是一个异步复制的过程,主库将数据更改记录到二进制日志中,从库io线程,开启一个普通客户连接, 从库获取主库的二进制日志,启动二进制日志转存储进程,它会读取二

进制日志事件,然后将其写自己的中继日志,其sql线程会对其中的事件进行重建。mysql复制的用途有做备份,负载平衡,高可用性及故障转移。


1.5 创建LVM

      在这里创建LVM,主要是为后面的lvm快照做备份时做铺垫,生产环境部署中这个lvm应该都事先部署好。

[root@master ~]# pvcreate /dev/sdb 创建物理卷Physical volume "/dev/sdb" successfully created
[root@master ~]# vgcreate mysqld /dev/sdb 创建卷组Volume group "mysqld" successfully created
[root@master ~]# lvcreate -L 1016M -n mysqld-data mysqld 创建逻辑卷Logical volume "mysqld-data" created
[root@master ~]# mkfs -t ext4 /dev/mysqld/mysqld-data 格式化逻辑卷
[root@master ~]# mount -t ext4 /dev/mysqld/mysqld-data /data 使用逻辑卷
[root@master ~]# df -h 查看
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda2 5.5G 3.8G 1.5G 72% /
tmpfs 122M 0 122M 0% /dev/shm
/dev/sda1 146M 45M 94M 33% /boot
/dev/sda5 9.7G 730M 8.5G 8% /opt
/dev/sdc 504M 78M 402M 17% /data03
/dev/mapper/mysqld-mysqld--data1001M 18M 932M 2% /data


1.6 更改数据库的数据目录

      这里的数据库的数据目录位置应该在部署数据库就应该考虑到,应避免数据库在运行中期来更改,以避免不必要的麻烦。

[root@master ~]# /etc/init.d/mysqld status
mysqld 已停
[root@master ~]# cp -rp /var/lib/mysql/ /data/ 拷贝原数据目录
[root@master ~]# chown mysql:mysql -R /data/mysql/ 更改权限

/etc/my.cnf更改如下

datadir=/data/mysql 数据目录

启动数据库

[root@master ~]# /etc/init.d/mysqld start
正在启动 mysqld: [确定]


2.配置master

  2.1/etc/my.cnf配置如下

log-bin-index=mysql-bin.index
log-bin=mysql-bin.log
server-id=10


       在这里,msyql索引名与日志文件名默认是主机名字,如果主机被更改,日志文件的名字就会有变化,这些就会导致恢复有问题,为标准化,需要统一命名日志文件名,其中包括中继日志的文件名。

注:如果数据库忘记root密码,可用这个mysqld_safe --skip-grant-tables选项启动数据,然后去登录(无需密码)数据库修改密码;


 2.2创建复制用户

mysql> grant replication slave on *.* to 'salves'@'192.168.4.%' identified by '123456'; 创建用户
Query OK, 0 rows affected (0.05 sec)
mysql> show grants for 'salves'@'192.168.4.%'; 查看权限
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for salves@192.168.4.% |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'salves'@'192.168.4.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


 2.3主库锁表只读

mysql> flush tables with read lock; 锁表
Query OK, 0 rows affected (0.06 sec)
mysql> show master status\G; 查看File,Position
*************************** 1. row ***************************File: mysql-bin.000007Position: 727Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
ERROR:
No query specified


2.4主库备份数据

[root@master ~]# mysqldump -uroot -p --all-databases >allbackdb.sql


3.slave配置

  3.1slave mysql的从库my.conf配置

在my.cnf中加入如下内容

relay-log-index=mysql-relay-index
relay-log=mysql-relay.log
server-id=11

  注:从库默认是不开启二进制日志,除非其要升级为主库。


重启mysqld服务

[root@Nodes03 ~]# service mysqld restart


  3.2从库恢复数据

[root@Nodes03 ~]# scp root@192.168.4.44:/root/allbackdb.sql .
[root@Nodes03 ~]# mysql -u root -p


  3.3连接同步到master端

mysql>slave stop; 停止slave
mysql> change master to master_host='192.168.4.44',master_user='salves',master_password='123456',master_log_file='mysql-bin.000007',master_log_pos=727;
mysql>slave start;
如果出现如下信息则连接成功
sql> show slave status\G;
*************************** 1. row***************************Slave_IO_State: Waiting for master to send event Read_Master_Log_Pos: 727Relay_Master_Log_File: mysql-bin.000007Slave_IO_Running: YesSlave_SQL_Running: Yes


  3.4回到主库解锁

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)


  3.5测试同步

  主库导入数据

[root@master ~]# mysql -uroot -p


 从库验证数据

113250810.jpg


4.LVM快照来备份还原

  上面备份与恢复的过程,我们可以用lvm快照的方式来完成,从而来实现其主从同步。


4.1主库锁表只读

mysql> flush tables with read lock; 锁表
Query OK, 0 rows affected (0.02 sec)
mysql> show master status\G; 查看File Position
*************************** 1. row ***************************File: mysql-bin.000007Position: 1575Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR:
No query specified


 4.2LVM快照并将其打包压缩

[root@master backup]# lvcreate --size 1024M --snapshot --name back_mysql /dev/mysqld/mysqld-data 快照
[root@master backup]# mount /dev/mapper/mysqld-mysqld--data /tmp/backup/ 挂载快照
[root@master backup]# tar -czvf mysql/ mysqlbackupdb.tar.gz 打包


 4.3从库获取LVM快照后的备份

[root@Nodes03 ~]# scp root@192.168.4.44:/tmp/backup/mysqlbackupdb.tar.gz /opt/
[root@Nodes03 ~]# tar -zxvf /opt/mysqlbackupdb.tar.gz
[root@Nodes03 ~]# mv mysql/* /var/lib/mysql/


 4.4连接同步到master端

mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='192.168.4.44',master_user='salves',master_password='123456',master_log_file='mysql-bin.000007',master_log_pos=1575;
Query OK, 0 rows affected (0.01 sec)
mysql> slave start;
Query OK, 0 rows affected (0.01 sec)
查看连接是否成功
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventRead_Master_Log_Pos: 1575 Relay_Master_Log_File: mysql-bin.000007Slave_IO_Running: YesSlave_SQL_Running: Yes

回到主库解锁

mysql> unlock tables;

 4.5测试

主库导入

mysql> source /root/vsftpddb.sql;


从库验证

121559485.jpg


     本文主要介绍mysql的主从同步,同步也简单的说了lvm的简单用法,典型的是lvm快照。同时还有mysql的同种备份方法:mysqldump与lvm快照。

至此mysql主从同步实验完成。仅为初学者的记录,如有问题请指出,不胜感激。