首页 > 代码库 > Mysql主从配置

Mysql主从配置

在原来LNMP 的环境下

[root@LNMP ~]# vim /etc/init.d/mysqld #查找数据库的安装路径

[root@LNMP ~]# cd /data/mysql/

[root@LNMP mysql]# ls

[root@LNMP mysql]# tar czvf discuz.tar /data/mysql/discuz/

#备份之前的discuz 论坛数据库表。

-----------------------------------------------------------------------

安装mysql:


[root@LNMP mysql]# rm -rf /usr/local/mysql  #删除之前的安装

[root@LNMP mysql]# cd /usr/local/src/

[root@LNMP src]# tar zxvf mysql-5.1.73-linux-x86_64-glibc23.tar.gz

[root@LNMP src]# mv mysql-5.1.73-linux-x86_64-glibc23 /usr/local/mysql


[root@LNMP src]# ls /usr/local/mysql

bin  COPYING  data  docs  include  INSTALL-BINARY  lib  man  mysql-test  README  scripts  share  sql-bench  support-files

[root@LNMP src]# grep ‘mysql‘ /etc/passwd  #检查有没有 mysql 这个用户,如果没有就创建

mysql:x:500:500::/home/mysql:/sbin/nologin


[root@LNMP mysql]# cp support-files/my-small.cnf  /etc/my.cnf  #拷贝配置文件

cp: overwrite `/etc/my.cnf‘? y


[root@LNMP mysql]# cp support-files/mysql.server  /etc/init.d/mysqld 

cp: overwrite `/etc/init.d/mysqld‘? y

[root@LNMP ~]# vim /etc/init.d/mysqld #编译mysql配置文件

basedir=/usr/local/mysql  #安装路径

datadir=/data/mysql       #数据库路径

[root@LNMP mysql]# rm -rf /data/mysql #删除原来的/datadir

[root@LNMP mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

#初始化 ,看到下面两个OK,则安装完成

[root@LNMP mysql]# echo $?

0

[root@LNMP mysql]# ls /data/mysql  #安装无误会生成这两个目录

mysql  test

技术分享

[root@LNMP ~]# /etc/init.d/mysqld start #启动mysql

[root@LNMP ~]# ps aux |grep mysql       #查看

[root@LNMP ~]# netstat -lnp |grep 3306

技术分享

----------------------------------------分割线----------------------------------------

[root@LNMP ~]# cd /usr/local/

[root@LNMP local]# ls

bin  etc  games  include  jdk1.8.0_112  lib  lib64  libexec  man  mysql  nginx  php  pureftpd  resin  sbin  share  src  tomcat

[root@LNMP local]# cp -r mysql mysql_slave  #创建第二个mysql (复制)


[root@LNMP mysql_slave]# chown -R mysql:mysql /data/mysql_slave #


[root@LNMP mysql_slave]# cp /etc/my.cnf . #拷贝配置文件到mysql_slave 下


[root@LNMP mysql_slave]# vim my.cnf  #编译配置文件

# The MySQL server

[mysqld]

port            = 3307         #3306 改为3307

socket          = /tmp/mysql_slave.sock #/tmp/mysql.sock改为/tmp/mysql_slave.sock

datadir         = /data/mysql_slave #定义数据库的目录



[root@LNMP mysql_slave]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql_slave #初始化数据库


[root@LNMP mysql_slave]# cd /etc/init.d/


[root@LNMP init.d]# cp mysqld mysqldslave  #复制启动文件


root@LNMP init.d]# vim mysqldslave #编译启动文件

basedir=/usr/local/mysql_slave #mysql 更改为mysql_slave

datadir=/data/mysql_slave  #mysql 更改为mysql_slave

conf=/$basedir/my.cnf #(这一条也可以写在这里)


# Try to find basedir in /etc/my.cnf

  conf=/$basedir/my.cnf   #更改conf=/etc/my.cnf 为 conf=/$basedir/my.cnf

-----------------------------------------------------------------------

[root@LNMP init.d]# /etc/init.d/mysqldslave start

Starting MySQL. SUCCESS!

[root@LNMP init.d]# /etc/init.d/mysqld start

Starting MySQL. SUCCESS!

[root@LNMP init.d]# netstat -lnp |grep mysql #两个mysql 都启来了

#扩展,如查需求还要启动一个mysql怎么解决


?按照开始的配置重新再配置即可。

技术分享

(因为楼主是LNMP 的环境下来搭建的,在这过程中出现了的些差错,由于楼主是个初学小白,排错的经验少了点,这之前出个两个问题,一是mysql帐户登不了,二是第二个mysql 初始化的时候不成功。

mysql登不了,是没有赋权,赋权就好了[root@LNMP mysql_slave]# chown -R mysql:mysql /data/mysql_slave 。初始化不成功)


---------------------------------------------------------------------------------

Mysql 主从配置:主是3306 从是3307

登录mysql 的几种方工

[root@LNMP ~]# which mysql

/usr/bin/mysql  #楼主预装了mysql 的命令


[root@LNMP ~]# /usr/local/mysql/bin/mysql #如果没有预装,就用绝对路径来登mysql

(把mysql安装目录,比如MYSQLPATH/bin/mysql,映射到/usr/local/bin目录下: 
# cd /usr/local/bin
# ln -fs /MYSQLPATH/bin/mysql mysq
l)


[root@LNMP ~]# mysql -S /tmp/mysql.sock #通过端口登录


[root@LNMP ~]# mysql #直接命令登录


[root@LNMP ~]# mysql -S /tmp/mysql_slave.sock #3307 的登录


[root@LNMP ~]# mysql -h127.0.0.1 -P3307 #通过端口登,(大P)


------------------------------------------------------------

[root@LNMP ~]# mysql -S /tmp/mysql.sock


mysql> create database db1;  #创建一个测试数据库

Query OK, 1 row affected (0.05 sec)


[root@LNMP ~]# mysqldump -S /tmp/mysql.sock mysql > 123.sql  #拷贝一些测试数据

-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

[root@LNMP ~]# mysql -S /tmp/mysql.sock db1 < 123.sql  #恢复数据到db1

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)


[root@LNMP ~]# vim /etc/my.cnf #配置主的配置文件

server-id       = 1  #打开server-id,这个数值主和从不能一样

og-bin=mysql-bin #打开log-bin,文件名是可以自定义的,楼主改为"rizhi"。

binlog-do-db=db1 #只针对db1做主从,后面可以跟多个库

#扩展(binlog-ignore-db=mysql,如果有上百个库,可以反向思考,做个黑名单,指定不同步的库mysql)

[root@LNMP ~]# /etc/init.d/mysqld restart #配置完成后,重启Mysql

Shutting down MySQL... SUCCESS! 

Starting MySQL. SUCCESS! 


[root@LNMP ~]# ls /data/mysql  #系统会生成一个mysql-bin 为前缀的文件

db1  ibdata1  ib_logfile0  ib_logfile1  LNMP.err  LNMP.pid  mysql  mysql-bin.000001  mysql-bin.index  test


[root@LNMP ~]# mysql -S /tmp/mysql.sock  #登录主,创建用户 replication:权限 ,repl:用户名


mysql> grant replication slave on *.* to ‘repl‘@‘127.0.0.1‘ identified by ‘123456‘;

Query OK, 0 rows affected (0.00 sec)


mysql> flush privileges;  #刷新权限

Query OK, 0 rows affected (0.00 sec)


mysql> flush tables with read lock; #锁死读的权限

Query OK, 0 rows affected (0.00 sec)


mysql> show master status; #查看mrizhi.0000001 的相关数据,在配置从同步的时候会用到

技术分享


-----------------------------------------

[root@LNMP ~]# vim /usr/local/mysql_slave/my.cnf  #从的配置

server-id       = 1111 #打开server-id,且自定义更改1111

#replicate-do-db=db1(扩展)


[root@LNMP ~]# ls

123.sql  anaconda-ks.cfg  install.log  install.log.syslog  opt  www.blog-andy.com.conf

[root@LNMP ~]# mysql -S /tmp/mysql_slave.sock -e "create database db1" #在从上创建db1

[root@LNMP ~]# mysql -S /tmp/mysql_slave.sock db1<123.sql 

                                      # 要实现同步,就要保证这两台机上库是一样的


[root@LNMP ~]# mysql -S /tmp/mysql_slave.sock #登录从


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=‘123456‘,master_log_file=‘rizhi.000001‘, master_log_pos=106;

Query OK, 0 rows affected (0.04 sec)

#这是个关键核心配置,语法拼写,一定要严谨。


mysql> slave start; #启动从

Query OK, 0 rows affected (0.01 sec)


mysql> show slave status\G; #查看状态 #没有配置成功


技术分享


查看下面的报错:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

[root@LNMP ~]# /etc/init.d/mysqldslave restart #重启从,刚才修改了server-id 没有重启

[root@LNMP ~]# mysql -S /tmp/mysql_slave.sock

mysql> show slave status\G;


技术分享

------------------------------------------------------

主从测试:

在主上的操作:

(mysql> flush tables with read lock; #因为之前有锁死的操作)


mysql>unlock tables;  #解锁读的权限


mysql> use db1;

Database changed

mysql> show tables;


mysql> drop table help_category; 


在从上的操作:

mysql> use db1;

Database changed

mysql> show tables;#详情见下图,同步成功。



技术分享



在主上的操作: 创建表


mysql> show create table user\G:  #用user表做范例

Create Table: CREATE TABLE `user` (

  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT ‘‘,

  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT ‘‘,

  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ‘‘,

  `Select_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Insert_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Update_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Delete_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Create_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

。。。。。。下略


CREATE TABLE `linuxt`

(

  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT ‘‘,

  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT ‘‘,

  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ‘‘,

  `Select_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Insert_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Update_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Delete_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

  `Create_priv` enum(‘N‘,‘Y‘) CHARACTER SET utf8 NOT NULL DEFAULT ‘N‘,

。。。。。。。。。。。

ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘Users and global privileges‘;

#在结尾去加分号“;”在命名表名的时候不要有数字,楼主开始的表名内有数字,总是报错。

mysql> use db1;

mysql> show tables;



技术分享


删除数据库操作:在从上同步成功。

技术分享




----------------------------------------------------------------------

mysql 的主从机制相当的脆弱,很容易就中断了,楼主在实验的过程中,不小心在从上进行了数据表的创建,最后发现不对。回到主上现来操作,发现创建不了,最后只能重新恢复数据表,再重新操作。

在实际生产环境中,做监控。

 Slave_IO_Running: Yes #监控这两项是不是YES

 Slave_SQL_Running: Yes

Last_IO_Error: (查看此处有没有报错)


一定不要在从上去写数据,这样操作会导致数据库紊乱。

本文出自 “CBO#Boy_Linux之路” 博客,请务必保留此出处http://20151213start.blog.51cto.com/9472657/1882281

Mysql主从配置