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.i686mysql-libs-5.1.69-1.el6_4.i686mysql-server-5.1.69-1.el6_4.i686[root@Nodes03 ~]# rpm -qa | grep mysql 从库确认mysql-5.1.69-1.el6_4.i686mysql-libs-5.1.69-1.el6_4.i686mysql-server-5.1.69-1.el6_4.i686
1.3设置开机启动
[root@master ~]# chkconfig --list mysqldmysqld 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭[root@master ~]# chkconfig --level 2345 mysqld on[root@Nodes03 ~]# chkconfig --list mysqldmysqld 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--data 1001M 18M 932M 2% /data
1.6 更改数据库的数据目录
这里的数据库的数据目录位置应该在部署数据库就应该考虑到,应避免数据库在运行中期来更改,以避免不必要的麻烦。
[root@master ~]# /etc/init.d/mysqld statusmysqld 已停[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.indexlog-bin=mysql-bin.logserver-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.000007 Position: 727 Binlog_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-indexrelay-log=mysql-relay.logserver-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 < allbackdb.sql
3.3连接同步到master端
mysql>slave stop; 停止slavemysql> 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: 727 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes
3.4回到主库解锁
mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)
3.5测试同步
主库导入数据
[root@master ~]# mysql -uroot -p
从库验证数据
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.000007 Position: 1575 Binlog_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 event Read_Master_Log_Pos: 1575 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes
回到主库解锁
mysql> unlock tables;
4.5测试
主库导入
mysql> source /root/vsftpddb.sql;
从库验证
本文主要介绍mysql的主从同步,同步也简单的说了lvm的简单用法,典型的是lvm快照。同时还有mysql的同种备份方法:mysqldump与lvm快照。
至此mysql主从同步实验完成。仅为初学者的记录,如有问题请指出,不胜感激。