Mysql主从复制
一. mysql的主从原理
mysql主从架构是当前比较成熟的高可用架构,配置也比较简单。
实现原理是:mysql主服务器将自己的操作记录例如增删改查等写入到binlog文件中去,而mysql从服务器,则开启两个线程 Slave_IO_Running和Slave_SQL_Running,IO线程是负责读取master的日志文件并写入到slave中的relay-log文件中,而sql线程则负责解析relay-log日志文件,将日志文件解析成 mysql从服务器可以执行的sql语句,写入到mysql从的库中,从而完成mysql的主从复制
二. mysql的基础知识
a. mysql中最常见的存储引擎为MyISAM和Innodb,其中innodb是支持事务,MyISAM不支持事务,支持事务是支持回归 b. myISAM中的每个库的每张表都会有3个文件.frm .myd .myi,其中frm文件为存放元数据信息,myd为存放数据,myi为存放索引的文件 c. innodb中如果是独享表空间的话,每个表一个ibd文件,而共享表空间的话,则所有表共同用ibdata文件 d. mysql主从复制中,在slave端存放的master.info文件是存放了该slave的master的相关信息,比如master机的IP,用户名,密码等信息而mysql-relay-bin文件是slave的IO线程从 master的binlog中读取到的信息,读取后在由slave的sql线程去解析此日志,并在slave端执行语句,完成主从复制,而relay-log.info文件和master.info文件的功能类似,此文件存放了 slave通过IO线程写入到slave的relay-log的相关信息 e. 在my.cnf配置文件中,有很多中括号,这里的每个中括号定义了针对每个组件使用的参数,例如mysqld组则是定义了mysql的启动参数,而mysqldump则是定义了在使用mysqldmp命令时要 用到的参数等等 f. mysql是一个模块化的组织结构,每个功能都是由相对应的功能模块来完成的,这里面有个query cache模块,就是完成了查询的缓存功能,当客户端提交了query请求后,如果服务器端在内 存中有此query的缓存结果则直接返回给客户端,如果没有缓存,则去执行此query 还有一个模块就是存储引擎模块,比如MyISAM和innodb在mysql中都是以模块的形式存在的,这个是mysql 独有的功能
三. mysql主从的实现
在主上的my.cnf文件中配置: [mysqld] log-bin=mysql-bin server-id=1 在主上执行命令: grant replication slave on [i].[/i] to 'sync'@'192.168.0.2' identified by '123456'; flush privileges; show master status; 记录此命令打印出来的两个值 mysqldump -u root -p master> master.sql #备份master数据库,此命令在shell中执行
在从上的my.cnf文件中配置:
[mysqld]
server-id=2
在从上执行命令:
此处的master_log_file和master_log_pos两个值就是show master status中打印出来的两个值
stop slave;
change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;
create database master;
mysql -u root -p master < master.sql #在从上导入master数据库,此命令在shell中执行
start slave;
四. mysql主从的验证
在从上执行命令: show slave status; #如果显示 Slave_IO_Running和Slave_SQL_Running都是YES状态的话,则表明线程正常
五. MySQL主从同步实例 (这里的命令执行的位置不在标明)
背景: 两台MySQL配置了主从同步,由于MySQL从机的硬盘报警,现需要将MySQL从机迁移到一台新服务器上,两个MySQL都是5.1.37版本
迁移步骤: [list=1] [*]由于两台MySQL都是线上服务器,而且都已经在运行且实时同步,所以在迁移的过程中,既要不影响使用,又要保证数据的完整性[/*] [*]在从机上操作(出故障的机器):[/*] [/list] stop slave; show slave status; #记录此处打印出的binlog的文件名和position两个值 scp -r /var/lib/mysql/db_monitor_service root@1.2.3.4:/usr/local/src scp /etc/my.cnf root@1.2.3.4:/usr/local/src [list=1] [*]在需要重新部署从库的机器上操作:[/*] [/list] 编译安装mysql5.1.37,且完成初始化和目录权限配置 在编译的时候,有一个地方需要注意,使用如下编译参数: ./configure --prefix=/usr/local/mysql5-3309 --enable-thread-safe-client --with-plugins=max-no-ndb --enable-assembler --with-tcp-port=3309 -- with-unix-socket-path=/usr/local/mysql5-3309/var/mysql.sock 在make的时候会有一个报错,解决这个错误需要修改Makefile文件,将文件的最后几行中的do_abi_check:后面的语句一直到done都全部删除,但do_abi_check:需要保留,保存后执行 make和make install安装 rm -f /etc/mysql/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbutu) rm -f /etc/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbuntu)初始化:
/usr/local/mysql5-3309/bin/mysql_install_db --basedir=/usr/local/mysql5-3309 --datadir=/usr/local/mysql5-3309/var --user=mysql mkdir /data1/var_3309/ chown -R mysql:mysql /data1/var_3309/启动MySQL:
/usr/local/mysql5-3309/bin/mysqld_safe --defaults-file=/usr/local/mysql5-3309/etc/my.cnf停止MySQL:
/usr/local/mysql5-3309/bin/mysqladmin -u root -p shutdown mv /usr/local/src/db_monitor_service /var/lib/mysql/ mv /usr/local/src/my.cnf /etc/my.cnf change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23; start slave; show slave status; #验证可用性和数据的完整性通过select语句查看最新数据是否和主库完成了同步