俗称:AB复制
replication :把主上的日志复制到从上,然后从根据日志去执行同样的操作,以达到俩个数据库的数据一致。
A - -> change data --> bin_log - transfer --> B -->repl_log --> change data 完成的一个过程。
[root@yiqiang ~]# cd /usr/local/src
[root@yiqiang src]# ls /usr/local/mysql
[root@yiqiang src]# rm -fr /usr/local/mysql 删除之前的mysql
.
1.)一台机上跑俩个mysql
[root@yiqiang src]# tar -zxvf mysql-5.1.73-linux-i686-glibc23.tar.gz 解压GZ格式包
[root@yiqiang src]# mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql/
[root@yiqiang src]# grep 'mysql' /etc/passwd 查看是否有mysql账户 mysql:x:500:500::/home/mysql:/sbin/nologin
如果没有则创建 #useradd -s /sbin/nologin mysql
[root@yiqiang src]# cd /usr/local/mysql/ [root@yiqiang mysql]# ls
[root@yiqiang mysql]# cp support-files/my-small.cnf /etc/my.cnf
[root@yiqiang mysql]# cp support-files/mysql.server /etc/init.d/mysqld 拷贝都直接覆盖原来的文件。
[root@yiqiang mysql]# vim /etc/init.d/mysqld 编辑其地址 :wq保存退出。
basedir=/usr/local/mysql
datadir=/data/mysql
[root@yiqiang mysql]# rm -fr /data/mysql 删除之前装的这个文件,让他从新生成文件。
[root@yiqiang mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql 初始化,安装
查看:
[root@yiqiang mysql]# echo $?
0
[root@yiqiang mysql]# ls /data/mysql
mysql test
有这俩目录就是ok的。安装完成。
[root@yiqiang mysql]# /etc/init.d/mysqld start
[root@yiqiang mysql]# ps aux|grep mysql
[root@yiqiang mysql]# netstat -lnp|grep mysql
----------------------------------------------------------------
另一个mysql的安装:
[root@yiqiang mysql]# cd ..
[root@yiqiang local]# ls
[root@yiqiang local]# cp -r mysql mysql_slave 重新拷贝一个解压的目录,并重命名mysql_slave[root@yiqiang local]# cd mysql_slave
[root@yiqiang mysql_slave]# ls
[root@yiqiang mysql_slave]# cp /etc/my.cnf . 把配置文件拷贝到当前目录下
[root@yiqiang mysql_slave]# vim my.cnf 进而编辑此文件,更改如下:
找到:[mysqld]port = 3306 socket = /tmp/mysql.sock skip-locking
[mysqld]
port = 3307
socket = /tmp/mysql_slave.sock
datadir = /data/mysql_slave
skip-locking
保存退出
[root@yiqiang mysql_slave]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql_slave 初始化
[root@yiqiang mysql_slave]# ls /data/mysql_slave/
mysql test
检查是否有此俩目录,
[root@yiqiang mysql_slave]# cd /etc/init.d 从新写一个启动脚本
[root@yiqiang init.d]# ls
[root@yiqiang init.d]# cp mysqld mysqldslave
[root@yiqiang init.d]# vim mysqldslave 编辑启动脚本
basedir=/usr/local/mysql_slave
datadir=/data/mysql_slave
conf=$basedir/my.cnf
找到 # Try to find basedir in /etc/my.cnfconf=/data/my.cnf
改成: conf=$basedir/my.cnf
:wq保存退出
[root@yiqiang init.d]# /etc/init.d/mysqldslave start
[root@yiqiang init.d]# ps aux|grep mysql
[root@yiqiang init.d]# netstat -lnp|grep mysql
可以看到俩个端口和两个sock,表示安装成功。续而装也以此类推。
2.)设置主3306 从3307
在3306上创建一个测试的数据库。
[root@yiqiang ~]# which mysql
由于mysql是挪动安装的,以及是删除之前mysql目录再安装的,之前有开机启动的设置,造成登陆不了。
通用过find命令查找sock文件 # find / -name mysql.sock
通过错误日志查找原因: /data/mysql/主机名.err
通过端口查找原因 #ps aux|grep mysql # netstat -lnp|grep mysql 或者搜索3306端口,来判断该端口谁在用 ,也有chkconfig原因
;
[root@yiqiang ~]# mysql -S /tmp/mysql.sock 3306的登陆方式。sock登陆
[root@yiqiang ~]# mysql -h127.0.0.1 -P3306 proth 登陆
[root@yiqiang ~]# mysql 因为之前做过pat.sh
[root@yiqiang ~]# mysql -S /tmp/mysql_slave.sock 3307的登陆 sock的登陆
[root@yiqiang ~]# mysql -h127.0.0.1 -P3307
[root@yiqiang ~]# mysql 3306默认登陆方式
mysql> create database db1; 创建库名db1
[root@yiqiang ~]# mysqldump -S /tmp/mysql.sock mysql > 123.sql
会出现警告,直接忽视。
可以看一下,弄些数据到db1
[root@yiqiang ~]# mysql -S /tmp/mysql.sock db1 < 123.sql
[root@yiqiang ~]#
登陆主 :mysql,查看库
mysql> use db1; Database changed mysql> show tables; +---------------------------+ | Tables_in_db1 | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 23 rows in set (0.00 sec) mysql>
针对
主 :db1库做实验,db1库数据为任意
----------------------------------------------------------
主:
[root@yiqiang ~]# vim /etc/my.cnf
编辑如下server-id = 1 #主、从数值不可一样
log-bin=aming #db2 # 只针对db1库做同步。后面需要再加就写db2 #白名单写法binglog-do-db=db1 # ,db2
---------------------------------------------------------------------------------------------------------------------------
binlog-ignore-db=mysql #黑名单写法 二条一般写一个就可以了,当同步的库比较多时,除了mysql库不更新,其他都更新。
保存退出
[root@yiqiang ~]# /etc/init.d/mysqld restart
ls /data/mysql
会有显示 aming. 为前缀的4文件(主机名字不同的者俩个 )
进入mysql,新建个用户 和权限replication 和密码123123
mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123123';
mysql> flush privileges; 权限从新 刷新
mysql> flush tables with read lock; 锁定表,只允许读。 下问有解锁
mysql> show master status; 读取数据有这三个 数值
aming.0000002 331 mysql
从:
从:登陆从:mysql -S /tmp/mysql_slave.sock
[root@yiqiang ~]# vim /usr/local/mysql_slave/my.cnf
把server-id = 1 改成 111 保存退出
[root@yiqiang ~]# ls 123.sql anaconda-ks.cfg install.log install.log.syslog
从上也要添加 库
[root@yiqiang ~]# mysql -S /tmp/mysql_slave.sock -e "create database db1" 把主上的库导入进去
[root@yiqiang ~]# mysql -S /tmp/mysql_slave.sock db1 < 123.sql 追加此库给从,保证机器同步必须要db1一样
接上
从:
[root@yiqiang ~]#mysql -S /tmp/mysql_slave.sock
mysql> slave stop;
先把从停了,在把主上的 指定host 端口 用户 密码
mysql>change master to master_host='127.0.0.1', master_port=3306, master_user='repl', master_password='123123', master_log_file='aming.000002', master_log_pos=106;
mysql> slave start; 启动从
mysql> show slave status\G; 需要查看到 有两个
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
yes 值,如果没有会显示错误消息
主与从就做好了,下面来测试。
[root@yiqiang ~]# mysql -S /tmp/mysql_slave.sock[root@yiqiang ~]# /etc/init.d/mysqldslave restart 重启服务器
3.)测试主与从的链接状态
主:
mysql
mysql> show master status; +--------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------+----------+--------------+------------------+ | aming.000003 | 106 | | mysql | +--------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql>
mysql>unlock tables; 解锁
mysql> use db1;
Database changed
mysql> show tables;
+---------------------------+ | Tables_in_db1 | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic | | host | | ndb_binlog_index | | plugin | | proc | | procs_priv | | servers | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 23 rows in set (0.01 sec)
mysql> drop table help_category; 删除一个表
转到
从:
mysql> use db1; Database changed mysql> show tables;
就会发现(上图中)少了个表 table help_category;
继续:主
删掉一个表
mysql> drop table proc;
继续:从
mysql> show tables;
就会发现少了proc 表
主:
创建一个表:
mysql> use db1; Database changed
mysql> show create table user\G; 先查看一个表详细,用以模仿
mysql>; #继续mysql> CREATE TABLE `yiqiang123`( --> `User`char 从括号出开始 粘贴 最后加上封号 ; #`反引号是
mysql> show tables
主、从:都可以操作
mysql> show tables;就可以查看到表了 yiqiang123,就完成同步了。主从连接过程中,易中断,需要时常监听,执行如下命令:在从上查探,执行mysql> show slave status\G; 需要查看到 有两个 yes 值,如果没有会显示错误消息从上不易操作,容易发生紊乱。只适合查看是否同步。主从复制 读写分离是一个概念如果断开了,可以尝试执行 stop slave; 然后执行 start slave;如果不能继续主从了,那只好重新做主从。
;