MySQL Replication 主要用于 MySQL 的时时备份或者读写分离在配置之前先做一下准备工作, 配置两台 mysql 服务器, 或者在一台服务器上配置两个端口也可以
流程示意图:
A-->change data-->bin_log-->transfer-->B-->repl_log-->change data
一搭建好了一个 mysql, 跑的是 3306 端口
1 下载 mysql 到 / usr/local/src/
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
2 解压缩
tar zxvf mysql - 5.6.35 - linux - glibc2.5 - x86_64.tar.gz
3. 把解压完的数据移动到 / usr/local/mysql
mv mysql - 5.6.35 - linux - glibc2.5 - x86_64 / usr / local / mysql
4. 建立 mysql 用户
useradd ? -s ? /sbin/nologin ? mysql
5. 初始化数据库
- cd /usr/local/mysql
- mkdir -p /data/mysql
- chown -R mysql:mysql ?/data/mysql
- ./scripts/mysql_install_db ?--user=mysql ?--datadir=/data/mysql
6. 拷贝配置文件
cp support - files / my - large.cnf ? /etc/my.cnf
拷贝配置文件
7. 拷贝启动脚本文件并修改其属性
- cp support-files/mysql.server ? ?/etc/init.d/mysqld
- chmod 755 ?/etc/init.d/mysqld
8. 修改启动脚本
vim / etc / init.d / mysqld
需要修改的地方有
- datadir = /data/mysql
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
- basedir = /usr/local / mysql
9. 把启动脚本加入系统服务项, 并设定开机启动, 启动 mysql
chkconfig --add mysqld
chkconfig mysqld on 或 service mysqld start 或 / etc/init.d/mysqld start
检查 mysqld 是否启动的命令为: ps aux |grep mysqld
二下面再搭建一个 3307 端口的 mysql:
- [root@localhost?~]#? mkdir /data/mysql_slave
- [root@localhost?~]# chown -R mt=ysql:mysql /data/mysql_slave
- [root@localhost?~]#?cd?/usr/local/
- [root@localhost?local]#?cp?-r?mysql?mysql_slave
- [root@localhost?local]#?cd?mysql2
- [root@localhost mysql_slave]#./scripts/mysql_install_db --user=mysql? --datadir=/data/mysql_slave
- [root@localhostmysql_slave]#?cp?/etc/my.cnf? .
- [root@localhost?mysql_slave]#?vim?my.cnf
- mysqld
? 改为: port = 3307 ?
? 改为: socket = /tmp/mysql_slave.sock
在这一行的下面再加一行:
?datadir=?/data/mysql_slave?
保存后就可以启动它了:
- [root@localhost mysql_slave]#?cd bin/
- [root@localhost bin]# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
重启: pid=`ps aux|grep mysql2.sock|grep -v grep|awk {print $2}`;kill $pid;cd /usr/local/mysql2/bin/; ./mysqld_safe --default-file=../my.cnf --user=mysql &
若开机启动, 需要把启动命令加入到 / etc/rc.local 中
如果想跟 mysqld 一样脚本启动, 则:
- [root@localhost mysql_slave]#?cd /etc/init.d/
- [root@localhost init.d]# cp mysqld ?mysqldslave
- vim mysqldslave
改 datadir=/data/mysql ? ? 为 ? datadir=/data/mysql_slave
?? basedir=/usr/local/mysql 为 ? basedir=/usr/local/mysql_slave
改 conf=/etc/my.cnf ? ? ? ? ? ? 为 ? conf=$basedir/my.cnf
也可以配置到 / etc/init.d/mysqlslave
cp - r mysql mysql_slave
同样修改
- basedir=/usr/local/mysql_slave
- datadir=/data/mysql_slave
- conf=$basedir/my.cnf
后面的 conf 路径
conf = $basedir / my.cnf
但是不能使用 / etc/init.d/mysqlslave start 启动
可以使用 service mysqlslave start
- [root@hardman bin]# chkconfig --add mysqldslave
- [root@hardman bin]# chkconfig mysqldslave on
- [root@hardman bin]# chkconfig --add mysqld
- [root@hardman bin]# chkconfig mysqld on
也可以将写入到 / etc/rc.d/rc.local 文件中:
echo ? "./mysqld_safe?--defaults-file=../my.cnf?--user=mysql?&" ? >>/etc/rc.d / rc.local
三在主服务器上创建测试数据库:
三在主服务器上创建测试数据库:
登录两台 mysql
- mysql -h127.0.0.1 -P3306 #通过主机端口登陆
- mysql -h127.0.0.1 -P3307
- mysql -S /tmp/mysql.sock #通过 sock 登陆
- mysql -S /tmp/mysql_slave.sock
mysql -uroot -p 密码 #通过密码登陆
登录 mysql:/usr/local/mysql/bin/mysql -uroot -p199610
? ? ? ? 或 mysql -S ?/tmp/mysql.sock ?
登录 mysql_slave:mysql -S ?/tmp/mysql_slave.sock ? 或者 mysql -h127.0.0.1 -P3307 (无密)
?
把 3306 端口的 mysql 作为主(master), 而把 3307 的 mysql 作为从(slave)
为了让实验更加像生产环境, 先在 master 上创建一个库 db1
- [root@localhost?bin]#?mysql?-uroot?-S?/tmp/mysql.sock -p199610
- mysql>?create?database?db1;
- Query?OK,?1?row?affected?(0.01?sec)
- mysql>?quit
- Bye
- // -S 后面指定 mysql 的 socket 文件路径, 这也是登陆 mysql 的一种方法, 因为在一台服务器上跑了两个 mysql 端口, 所以, 只能用 -S 这样的方法来区分
- ?
创建了 db1 库, 然后把 mysql 库的数据复制给它:
- mysqldump?-uroot?-S?/tmp/mysql.sock? mysql?>?123.sql ? ? #备份?
- mysql?-uroot?-S?/tmp/mysql.sock?db1?<?123.sql ? ? #恢复
设置主 master
修改配置文件:
vim?/etc/my.cnf
在 [mysqld] 部分查看是否有以下内容, 如果没有则添加:
- server - id = 1 log - bin = mysql - bin // 可以修改为 aiker 等等
除了这两行是必须的外, 还有两个参数, 你可以选择性的使用其中一个:
- # 指定库的主从
- #binlog-do-db=db1,db2
- # 忽略指定库主从, 黑名单
- #binlog - ignore - db = mysql
- binlog-do-db= #需要复制的数据库名, 多个数据库名, 使用逗号分隔
- binlog-ignore-db= #不需要复制的数据库库名, 多个数据库名, 使用逗号分隔这两个参数其实用一个就可以
重启 mysql 服务:
- /etc/init.d / mysqld restart
- ls ?/data/mysql
查看 / data/mysql 下, 会出现以 log-bin 值文件:
aiker.000001??
?
设置 mysql 数据库的 root 访问密码:
设置密码:
mysqladmin ? -uroot ? -S ? /tmp/mysql.sock ? password ? 199610
登录:
- mysql ? -uroot ? -S ? /tmp/mysql.sock ? -p199610
- ?
- mysql > ?grant ? replication ? slave ? on ? *. * ?to ? repl@127.0.0.1 ? identified ? by ? 123456;
- // 这里的 repl 是为 slave 端设置的访问 master 端 mysql 数据的用户, 密码为 123456, 这里的 127.0.0.1 为 slave 的 ip(因为我们配置的 master 和 slave 都在本机)
- mysql>?flush privileges; ? ? ? #刷新??
- mysql>flush tables with read lock; #锁定数据库, 此时不允许更改任何数据
- mysql>unlock tables;
- mysql> show master status; #查看状态, 这些数据是要记录的, 一会要在 slave 端用到
- +--------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +--------------+----------+--------------+------------------+
- | aiker.000001 | 587 | | |
- +--------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
设置 slave
先修改 slave 的配置文件 my.cnf:
vim ? /usr/local / mysql_slave / my.cnf
找到 server-id = 1 这一行, 删除掉或者改为 server-id = 2 总之不能让这个 id 和 master 一样, 否则会报错
另外在从上, 如下两行, 黑白名单, 看主 mysql 有没有配置
- replicate-do-db=db1,db2
- replicate-ignore-db=db1,db2
改完后, 重启 slave:
service mysqld_slave restart
拷贝 master 上的 db1 库的数据到 slave 上, 因为 master 和 slave 都在一台服务器上, 所以操作起来简单了很多, 如果是不同的机器, 可能就需要远程拷贝了, 希望你注意这一点:
- [root@localhost?~]#?mysqldump?-uroot?-S?/tmp/mysql.sock?-pyourpassword db1?>?123.sql
- [root@localhost?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?-e?"create?database?db1"
- [root@localhost?~]#?mysql?-uroot?-S?/tmp/mysql_slave.sock?-pyourpassword?db1?<?db1.sql
二行中,-e 选项, 它用来把 mysql 的命令写到 shell 中, 这样可以方便把 mysql 操作写进脚本中, 它的格式就是?-e?"commond"? 它很实用
把数据拷贝过来后, 就需要在 slave 上配置主从了:
- mysql> slave stop;
- Query OK, 0 rows affected, 1 warning (0.00 sec)
- mysql> change master to master_host=127.0.0.1,master_port=3306,master_user=repl, master_password=123123,master_log_file=aiker.000001, master_log_pos=587;
- Query OK, 0 rows affected (0.02 sec)
- mysql> slave start;
- Query OK, 0 rows affected (0.00 sec)
- mysql> show slave status\G
在主 mysql 上解锁
mysql - uroot - S / tmp / mysql_slave.sock - p123123 - e "unlock tables"
或者
- mysql> unlock tables;
- Query OK, 0 rows affected (0.00 sec)
3 测试主从
在 master 上执行如下命令:
- [root@hardman bin]#mysql - uroot - S / tmp / mysql.sock - pederew - e "use db1;select count(*) from db"
- +----------+
- | count(*) |
- +----------+
- | 2 |
- +----------+
- [root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;truncate table db" 清空 db1 的表
- [root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
- +----------+
- | count(*) |
- +----------+
- | 0 |
- +----------+
- [root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
- +----------+
- | count(*) |
- +----------+
- | 0 |
- +----------+
slave 上的该表也被清空了这样好像不太明显, 不妨继续把 db 表删除试试:
- [root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
- ERROR 1146 (42S02) at line 1: Table db1.db doesnt exist
主从配置起来很简单, 但是这种机制也是非常脆弱的, 一旦我们不小心在从上写了数据, 那么主从也就被破坏了另外如果重启 master, 务必要先把 slave 停掉, 也就是说需要在 slave 上去执行 slave stop 命令, 然后再去重启 master 的 mysql 服务, 否则很有可能就会中断了当然重启完后, 还需要把 slave 给开启 slavestart.
来源: http://www.bubuko.com/infodetail-2492234.html