mysql在同一台机器上实现主从复制,多个mysql(windows)

主从数据库数据同步,可以使用从数据库来实时备份主数据库,当主数据库被破坏,可以马上启用从数据库。


一、从C盘拷贝MYSQL到D盘,命名为MYSQL2

把"C:\MySQL" 修改为 "D:\MySQL2"


修改配置文件my.ini

[client]

port=3307

[mysqld]

port=3307

basedir="D:/MYSQL2/"

datadir="D:/MYSQL2/Data/"


安装一个新的MYSQL数据库,服务命名为MySQL2

在cmd命令行模式下

D:\MySQL2\bin>mysqld-nt install MySQL2  --defaults-file="D:\MySQL2\my.ini"

若出现 Service successfully installed,则服务安装成功;若出现install remove of the service denied,只需要打开cmd时

以管理员身份打开即可解决()!


好了,我们来到服务,启动MySQL2,当然也可以命令提示符来停止与启动

net stop MySQL2

net start MySQL2


//====小技巧===//

1、如要修改MySQL2服务路径:

运行regedit,进入注册表 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL2

修改ImagePath的数据

D:\MYSQL2\bin\mysqld-nt --defaults-file=D:\MYSQL2\my.ini MySQL2


2、如要删除服务

sc delete MySQL2


3、如果提示1067错误,请检查一下my.ini文件,basedir="D:/MYSQL2/",datadir="D:/MYSQL2/Data/"里面的路径是否写错了。或

检查一下注册表MySQL2的ImagePath数据,--defaults-file="D:\MySQL2\my.ini"里面的路径是否写错了;


 

二、主从数据库同步示例

主数据库的配置(my.ini)

[mysqld]

server-id = 1

log-bin=mysqld-bin

replicate-do-db=test


port=3306

从数据库的配置(my.ini)

[mysqld]

server-id = 2

log-bin=mysqld-bin

master-host = 127.0.0.1

master-user = slave

master-password = 123

master-port = 3306

master-connect-retry=5

replicate-do-db=test #需要同步的数据库,很关键

log-slave-updates


port=3307

配置好了之后

net stop MySQL

net start MySQL

net stop MySQL2

net start MySQL2

重启即可,主数据的操作会自动更新到从数据库中。需要注意点是,从数据库的数据结构要保持和主数据库一致,不然不能同步主数据库的数据。


//====小技巧===//

MYSQL2的命令提示符,可以通过设置环境变量来实现,修改mysql.exe为mysql2.exe即可

//锁定所有表(不需要停止MYSQL服务器,可以有读的功能,保持网站继续正常运行)

FLUSH TABLES WITH READ LOCK;

//解除锁定

UNLOCK TABLES;


//显示主数据库状态

SHOW MASTER STATUS \G

//显示从数据库状态

SHOW SLAVE STATUS \G

//设定不同步的数据库,这些库的修改不会记录到日志(可以添加多行)

binlog-ignore-db = test

//设置同步的数据库(设置“从数据库”的配置文件,如果主的MYSQL数据库很多,而从的MYSQL数据库只有一个数据库,操作其他数据库的时候就会报错,从而终止从数据库不能实时的更新)

replicate-do-db=test

//新建一个专门备份的用户(Repl_slave_priv: Y)

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123';

FLUSH PRIVILEGES;

//在slave上执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER"(Select_priv: Y,File_priv: Y,Repl_slave_priv: Y)

GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123';

FLUSH PRIVILEGES;


------------------------------------------------------------------------------
环境:
OS:Windows XP
DB:MYSQL5.5
 
1.正常安装第一个mysql(安装步骤省略)
 
2.在控制面板里停止第一个mysql服务
 
3.将C:\Program Files\MySQL目录下的所有目录和文件copy到另外一个路径,我这里是copy到E盘
 
4.创建第二个mysql的my.ini文件
第一个mysql的my.ini文件默认是在如下路径
C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\my.ini
copy该ini文件存放到E:\MySQL\mysql_base,这个路径可以随意定义,并修改如下内容:
[client]
port=3307 #第一个数据库的默认端口是3306 这里需要另外启用一个端口
# The TCP/IP Port the MySQL Server will listen on
port=3307
# Path to installation directory. All paths are usually resolved relative to this.
basedir="E:\MySQL\MySQL Server 5.5\"
         #第二个数据库basedir
# Path to the database root
datadir="E:\MySQL\MySQL Server 5.5\data\"
    #第二个数据库datadir
 
5.创建启动服务(此时在控制面板中可以看到增加了一个新的服务)
mysqld install MySQL2  --defaults-file="E:\MySQL\mysql_base\ini\my.ini"


若出现 Service successfully installed,则服务安装成功;若出现install remove of the service denied,只需要打开cmd时

以管理员身份打开即可解决!

 
6.修改注册表
HKEY_LOCAL_MACHINE-->SYSTEM-->CurrentControlSet-->Services
找到刚才创建的MySQL2,将ImagePath修改成如下":
"E:\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="E:\MySQL\mysql_base\ini\my.ini" MySQL2

参考:http://blog.chinaunix.net/uid-77311-id-3450734.html


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

转自:http://www.cnblogs.com/yuechaotian/archive/2013/05/15/3080056.html

1、首先要在本地建立两个mysql服务(首先正常使用安装包安装第一个,第二个使用免安装版,参考这里),指定不同的端口。我

这里一个主(3306),一个从(3307)。

2、然后修改主配置文件:

[mysqld]

server-id = 1   

binlog-do-db=test #要同步的数据库

#binlog-ignore-db=mysql   #不同步的数据库,如果指定了binlog-do-db这里应该可以不用指定的

log-bin=mysql-bin #要生成的二进制日记文件名称

修改从配置文件:

[mysqld]

server-id = 2

log-bin    = mysql-bin

replicate-do-db=test

3、在主库添加一个用户 repl 并指定replication权限

create user 'repl'@'127.0.0.1' identified by 'asdf';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1'; -- --这里我指定数据库(test.*)时报错,而指定全库(*.*)时会成功。

4、保持主从mysql的test数据库初始状态一致。

一般是先将所有的表加读锁,然后copy磁盘上的数据库文件夹。我这里直接停止服务,然后将数据文件拷贝过去。

5、在主数据库里面运行show master status;记下file和position字段对应的参数。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | test | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

6、在从库设置它的master:

mysql> change master to

master_host='127.0.0.1',master_port=3306,master_user='repl',master_password='asdf',master_log_file='mysql-

bin.000001',master_log_pos=107;

Query OK, 0 rows affected (0.19 sec)

这里的master_log_file和master_log_pos对应刚才show master status记下的参数。

7、在从库开启从数据库复制功能。

slave start;

mysql> slave start;

Query OK, 0 rows affected (0.00 sec)

在从库可以通过show slave status来查看一些参数。

8. 此时在主库创建表或插入数据,在从库就会很快也能看到了。

-- 主库

mysql> create table tianyc_02(b int);

Query OK, 0 rows affected (0.16 sec)

mysql> insert into tianyc_02 values(2013);

Query OK, 1 row affected (0.13 sec)

-- 从库

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tianyc_01 |
| tianyc_02 |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from tianyc_02;
+------+
| b |
+------+
| 2013 |
+------+
1 row in set (0.00 sec)

同理,可以搭建第二、第三个从节点。

备注:两个服务的serve_id必须不同,否则在开启复制功能时会提示错误

mysql> slave start;

ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO

我这里设置的主节点id为1,从节点id为2。也可以按照ip或端口进行设置,好用来区分。

注意:

    * 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。 

    * 如果主从的网络断开,从会在网络正常后,批量同步。 

    * 如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况

下,非常小心的修改从上的数据。

参考:http://bbs.chinaunix.net/thread-2297959-1-1.html

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

最近在自学,看到了mysql的主从复制,觉得挺有意思的,就研究了下.无奈试了多种方法均以失败告终,最后只好在同一台机器上安装多个mysql.试试主从复制.
一共试了三种方式,目前只成功了一种.
1.用云服务器坐从服务器,本地的电脑做主服务器.但是因为电脑是在内网里面...无法被访问到.就使用了花生壳和nat123.进行端口映射.这样做之后,云服务器A(叫做A好了),可以通过映射的域名来访问本地的数据库了.但是在进行主从复制的配置的时候,似乎主机的IP地址就不能填写域名.(不清楚是不是这样). 因为直接通过映射的域名是可以访问到数据库中的数据的,但是一到主从复制,然后配置IP地址,填写的域名,就会报错.屡次不成功,然后我就试了第二种方式.
2.使用虚拟机和主机进行主从复制. 个人不是很会使用虚拟机这个东西.阻力在于虚拟机和主机能相互ping通,而且要在虚拟机上装上mysql.虚拟机装的是centos7.= =本人能力有限加上运气不好,怎么安装mysql都失败. 最后用源码安装成功后,还是无法访问本机的mysql.最终尝试了最简单,能够找回自信心的方式.在同一台机器上安装多个mysql.来实现mysql的主从复制.
 
首先.我本机上装了一个mysql5.6.  然后复制了mysql5.6在修改了  第二个mysql(叫mysql2好了)的my.ini.  就可以安装了两个mysql.
这个比较容易.可以参考http://www.cnblogs.com/yuechaotian/archive/2013/05/15/3079919.html.

然后在进行mysql的配置.
注:这里主机和从机因为是复制的,所以一开始它们的版本和数据库表结构什么的都是一致的.   因为我不知道数据库版本不一致和数据库表结构不一样会不会影响到主从复制.之后可能会尝试着试验一下.这两个变量对主从复制的影响.  (所以说在同一台机器上是最简单的方式,不用管版本,表结构,ip地址什么的)
1.在主机的my.ini(windows是这个,linux应该是/etc/my.cnf)添加一些配置
在[mysqld]下添加配置数据:
server-id=1     #服务器的标识  要和从服务器不一样
log-bin=mysql-bin  #二进制文件存放路径 (说明开启了二进制日志,关键点)

binlog-do-db=db1             #是你需要复制的 数据库 名称,如果有多个就用逗号“,”分开;或者分行写
binlog-ignore-db=mysql  #不参与主从的数据库名,不参与主从复制的数据库名mysql
保存,重启数据库服务。

2.给从服务器提供一个远程访问主服务器的账号
1.mysql>grant replication slave on *.* to  mycat @l ocalhost identified by ' 123456' ;   创建一个远程访问的账户
2.mysql>flush privileges; 刷新权限,为了让这个账户能直接使用
3.mysql>show master status; # 找到File 和 Position 的值记录下来;(从服务器就是根据这个日志来复制的. 附上主从复制的原理http://machael.blog.51cto.com/829462/239112/)

3.从库的配置
server-id=2     #唯一
#设置要进行或不要进行主从复制的数据库名,同时也要在Master 上设定。
replicate-do-db=进行主从数据库名1 ,数据库名2
replicate-ignore-db=不进行数据库名1 ,数据库名2.这里跟主库的配置差不多

4.设置主库的信息.将从库和主库联系起来
mysql>change master to 
master_host='127.0.0.1',
master_user='mycat',
master_password='123456',
master_log_file='mysql-bin.000005',
master_log_pos=120;
这里的配置就是使用的上面主库的信息.还有日志文件的信息
5.
 mysql>start slave ;
mysql>show slave status\G;
如果出现:
Slave_IO_Runing:Yes
Slave_SQL_Running :yes
就说明成功了.然后你在主数据库的增删改查,看看从数据库.应该就会同步执行了.

不过不会这么顺利的= =.下面列出来一些我遇到的问题
1. Last_Error:XXX@localhost   失败.
没有截图了,这个是用户名和密码的问题.  
首先要明确是主库费从库开了一个账户mycat,然后从库在用这个账户登录主库,拿到二进制的日志.  
所以这个账户是在主库的.我一开始弄错了,把这个账户弄在了从库.所以报错.
 
还有一点.就是主库给从库开启权限的时候要细心一点,我从网上看到有的人是 'mycat  '@localhost这一步.用户名多了个空格.或者密码多了个空格所以导致从库访问主库失败.
因此,主库开启完权限后,要先试着用这个mycat的账户远程登录主库试试.能登录才进行下一步.

2. 错误号为1062的. 类似duplicate entry的错误.
这个可能是主从库的主键冲突.
解决方式:
方式1.在从库执行set global sql_slave_skip_counter=1 这个是用来跳过错误的.
方式2:删除主和从相应记录,在主库在重新加入该记录insert.

3.uuids:冲突
解决方式:修改主或者从的auto.cnf.
先使用select uuid(),获得一个随机的UUid.在修改auto.cnf中的uuid.记得改完重启mysql.


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

注意:mysql主从复制,主从版本要一致!正常情况下,主从mysql应该安装在两台服务器上

1.下载mysql的安装包

mysql官网:http://dev.mysql.com/downloads/mysql/

这里会有msi格式的和zip格式,msi格式的需要点击安装,这里不讲这个,接下来讲的是zip格式。

2.解压mysql的zip包

解压 zip 压缩文件,得到 一个文件夹 ,将其拷贝到你想要放的目录(比如我是放在D:/tools/mysql下 
复制两份),然后分别将文件夹重命名为 mysql1 和 mysql2 。

3.安装主mysql

找到mysql1的配置文件模板D:\tools\mysql\mysql1 目录下的 my-default.ini,重命名为 my.ini,在 [mysqld] 标签下添加如下代码:

[mysqld] 
basedir = D:\tools\mysql\mysql1
datadir = D:\tools\mysql\mysql1\data
binlog-do-db=test 
binlog-ignore-db=mysql 
log-bin=mysql-bin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注: 
binlog-do-db=test 表示需要备份的数据库为test 
*binlog-ignore-db=mysql 表示不需要备份的数据库为mysql 
如果两个都不设的话,从服务器会复制主服务器的全部数据库 
log-bin=mysql-bin 表示开启二进制日志,并把二进制日志前缀改为mysql-bin

其他的不用修改保存my.ini文件,然后以管理员的身份运行cmd,将工作目录切换到D:\tools\mysql\mysql1\bin下,运行

mysqld -install
  • 1
  • 2

如果提示“Service successfully installed”,则说明mysql服务安装成功,默认的服务名称为MySQL,端口号为3306,密码默认为空 
连接mysql主服务器

mysql -uroot -p -P3306
  • 1
  • 2

然后创建新用户:

create user 'mytest'@'127.0.0.1' identified by '123456';
  • 1
  • 2

注: 
@后面的ip地址为允许连接的客户端的ip地址。mytest是用户名,123456是密码

然后,给新用户配置主从复制的权限:

grant replication slave on *.* to 'mytest'@'127.0.0.1' identified by '123456';
  • 1
  • 2

注: 
@后面的ip地址为允许连接的客户端的ip地址,如果改为 ‘%’,就表示客户端没有ip地址的限制

然后查看主服务master的状态: 
mysql> show master status;

+——————+———-+————–+——————+——————-+ 
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+——————+———-+————–+——————+——————-+ 
| mysql-bin.000003 | 106 | test | mysql | | 
+——————+———-+————–+——————+——————-+

注意: 
记住file,和position,因为等下配置从数据库的时候会用到

4.安装从mysql

找到mysql2的配置文件模板D:\tools\mysql\mysql2 目录下的 my-default.ini,重命名为 my.ini,并修改如下这几项:

[client]
port = 3307
[mysqld]
port= 3307
basedir=D:\tools\mysql\mysql2
datadir=D:\tools\mysql\mysql2\data 
server-id = 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

保存my.ini后,用 管理员身份 运行cmd,并切换到D:\tools\mysql\mysql2\bin目录下,运行

mysqld install MySQL2  --defaults-file="D:\tools\mysql\mysql2\my.ini"
  • 1
  • 2

如果提示“Service successfully installed”则说明安装成功了,这时候我们连接从myslq

mysql -uroot -p -P3307
  • 1
  • 2

配置复制的参数: 
change master to master_host=’127.0.0.1’,master_user=’mytest’,master_password=’123456’,master_port=3306,master_log_file=’mysql-bin.000003’,master_log_pos=106;

参数详解: 
master_host: 主服务器的IP 
master_user: 主服务器上新创建的用户名 
master_password: 用户的密码 
master_port: 主服务器的端口,如果未曾修改,默认即可。 
master_log_file: 主服务器二进制日志文件的名称,填写查看主服务器的master状态时显示的File的值 
master_log_pos: 日志的位置,填写查看主服务器的master状态时显示的Position的值

启动从服务的slave复制功能:

start slave;
  • 1
  • 2

查看从服务器的slave状态:

show slave status \G
  • 1
  • 2

***************** 1. row ***************** 
Slave_IO_State: Waiting for master to send event 
Master_Host: 127.0.0.1 
Master_User: mytest 
Master_Port: 3306 
Connect_Retry: 60 
Master_Log_File: mysql-bin.000003 
Read_Master_Log_Pos: 106 
Relay_Log_File: DESKTOP-DMGAKUM-relay-bin.000002 
Relay_Log_Pos: 251 
Relay_Master_Log_File: mysql-bin.000003 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 
Replicate_Do_DB: 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
Last_Errno: 0

如果 Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes,则说明主从复制的所有配置已成功,即从服务器已经可以自动与主服务器的数据库数据实现同步了。 
此后,只要主服务器的数据有更新(比如:在 test数据库中新建了一张表或者表中的数据发生了变化),从服务器都会自动与主服务器保持一致。但如果有人刻意改变了从服务器的数据,主服务器中的数据并不会同步更新,除非我们把这两个MySQL服务器设置为互为主从。

注: 
如果有任一个显示NO,则证明同步有问题。可以查看数据库日志文件,里面基本上会显示出错误之处,根据错误一步一步排查,基本上都可以解决的。数据库日志在data目录下,错误日志的后缀是.err

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

如果启动服务的时候提示:

本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止

去查看 .err文件,查看报错情况,如果出现:mysqld: Table 'mysql.plugin' doesn't exist windows

如果出现这个错误,需要把 先安装的  C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql 文件夹 拷贝到 

E:\MySQL2\MySQL Server 5.7\Data ,然后重新启动,ok了

出现问题1:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解决问题1:
方法一:
root密码为空时用下面命令修改, 修改成123456:
mysqladmin -u root -p password  123456
重新登录
mysql -uroot -p -P3306

ok!

问题2:
mysql> create user 'mytest'@'127.0.0.1' identified by '123456';
出现如下错误:
ERROR 1396 (HY000): Operation CREATE USER failed for 'mytest'@'127.0.0.1'


解决办法:
先删除,然后在重新创建
drop user 'mytest'@'127.0.0.1';
create user 'mytest'@'127.0.0.1' identified by '123456';

猜你喜欢

转载自blog.csdn.net/wrh_csdn/article/details/80198795