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 . 3.3连接同步到master端 mysql>slave stop; 停止slave 3.4回到主库解锁 mysql> unlock tables; 3.5测试同步 主库导入数据 [root@master ~]# mysql -uroot -p 从库验证数据 4.LVM快照来备份还原 上面备份与恢复的过程,我们可以用lvm快照的方式来完成,从而来实现其主从同步。 4.1主库锁表只读 mysql> flush tables with read lock; 锁表 4.2LVM快照并将其打包压缩 [root@master backup]# lvcreate --size 1024M --snapshot --name back_mysql /dev/mysqld/mysqld-data 快照 4.3从库获取LVM快照后的备份 [root@Nodes03 ~]# scp root@192.168.4.44:/tmp/backup/mysqlbackupdb.tar.gz /opt/ 4.4连接同步到master端 mysql> slave stop; 回到主库解锁 mysql> unlock tables; 4.5测试 主库导入 mysql> source /root/vsftpddb.sql; 从库验证 本文主要介绍mysql的主从同步,同步也简单的说了lvm的简单用法,典型的是lvm快照。同时还有mysql的同种备份方法:mysqldump与lvm快照。 至此mysql主从同步实验完成。仅为初学者的记录,如有问题请指出,不胜感激。
[root@Nodes03 ~]# mysql -u root -p
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
Query OK, 0 rows affected (0.00 sec)
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
[root@master backup]# mount /dev/mapper/mysqld-mysqld--data /tmp/backup/ 挂载快照
[root@master backup]# tar -czvf mysql/ mysqlbackupdb.tar.gz 打包
[root@Nodes03 ~]# tar -zxvf /opt/mysqlbackupdb.tar.gz
[root@Nodes03 ~]# mv mysql/* /var/lib/mysql/
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