1、本地安装多个数据库

前边有过介绍这里不再重复,安装完成以后可能会遇到安装以后不能启动的问题。

解决办法:

  1. 打开注册表(开始->运行->regedit);
  2. HKEY_LOCAL_MACHINE->SYSTEM->services;找到服务名称,取决于mysqld install mysql8,安装的时候使用的服务名称,我的是mysql8;
  3. 找到ImagePath,双击查看数值数据,后边的路径是否是安装mysql的使用的路径,D:\mysql-8.0.27-winx64\bin\mysqld mysql8,其中D:\mysql-8.0.27-winx64是我安装mysql8的路径;

php与mysql搭建网站(php手把手教你做网站)(1)

图1 mysql安装多版本 不能启动

我使用了一个mysql5.7,还有2个mysql8进行测试。

2、环形主从

A->B->C->D->A

也就是每个服务器即是主数据库,又是从数据库,形成环状,首尾相接。

优点:可以方便更换主机,当A主数据库出了问题,可以把1号从数据库直接换为主数据库;

缺点:当其中一个从数据库出了问题,后边的链条就断开了,不能做到同步;

3、发散式主从

A->B,A->C,A->D

只有一个主数据库(A),其他的数据库(B、C、D)都是A的从数据库。

4、主从配置

1)主数据库配置(A)my.ini

[mysqld] server-id=1 log-bin=D:\mysql2\log\mysql-bin

说明:

  1. server-id,相当于门牌,每个数据库是唯一的,不要发生重复;
  2. log-bin日志的存放位置,我这里是指定了位置;

如果是双向同步,A即是主也是从数据库,如下配置

[mysqld] server-id=1 log-bin=D:\mysql2\log\mysql-bin replicate-wild-do-table=master.np_web_copy #上下2个是有空行的,测试,没有空行的时候同步失败了, #根据自己需要来写,如果同步失败 又不提示错误,可以把2个加上空行试试 replicate-wild-do-table=master.np_web_tags #replicate_wild_ignore_table= 忽视的表

说明:

  1. replicate-wild-do-table要同步的表;
  2. replicate_wild_ignore_table同步的时候忽视的表;
  3. 如果同步的表比较少,可以使用replicate-wild-do-table指定要同步的,反之如果同步的表格比较多,则应该是指定不同步的表;
  4. 可以看到我同步的是2个表,2个replicate-wild-do-table之间加了空白行;
  5. 配置完成以后数据库服务要重启;

在测试同步的时候开始replicate-wild-do-table是直接没有空白行写的,但是不提示错误,也不同步数据,后来加了空白行就可以同步了。

2)从数据库(B)配置my.ini

和上边主数据库配置是一样的,更改下server-id,log-bin就可以了。

server-id=3 log-bin=D:\mysql-8.0.27-winx64\log\master-bin replicate-wild-do-table=master.np_web_copy replicate-wild-do-table=master.np_web_tags

说明:

如果只是作为从库,log-bin不需要配置;

5、登陆主数据库,创建用户用于主从同步

1)登陆mysql

进入数据库安装目录bin文件夹,地址栏输入cmd

msyql -u root -p -P 3308

由于是本地安装多个数据库,肯定会涉及到使用不同端口

说明:root是用户名,p 后边是密码, 大写的P后边是端口

2)创建用户(主从同步)

mysql8以前的版本

grant replication slave on *.* to 'slave'@'127.0.0.1' identified by '123456';

mysql8

1、CREATE USER 'slave'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '123456'; 2、grant replication slave on *.* to 'slave'@'127.0.0.1';

flush privileges;

说明:

  1. 'slave'@'127.0.0.1'其中127.0.0.1从服务器IP,slave用户名,123456是密码,根据自己需要设置;
  2. 添加完成用户以后要刷新权限flush privileges;

6、cmd查看主数据库状态

1)锁表,防止在配置的时候日志发生改变,先锁起来,配置完成从数据库以后再解锁

flush tables with read lock;

2)查看主数据库状态

show master status;

php与mysql搭建网站(php手把手教你做网站)(2)

图2 master状态

  1. 这里可以查看到file(slave-bin.000008),Position(156);
  2. 每个数据库这里都可能是不同的,根据自己电脑显示的信息记录下来;

7、登陆从数据库

1)如果以前有过配置,需要先停止同步。

stop slave;

2)设置输入以下代码

CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3308,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='slave-bin.000008',MASTER_LOG_POS=156;

说明:

  1. 127.0.0.1主服务器的IP;
  2. 3308是端口;
  3. slave是添加的用户账号;
  4. 123456用户密码;
  5. slave-bin.000008是查看主数据库状态得到的file;
  6. 156同5一样是查看状态得到的Position;

3)启动同步

start slave;

4)查看状态

show slave status \G #如果只是show slave status;显示会很乱,使用上边的指令显示的会更加清晰一些;

php与mysql搭建网站(php手把手教你做网站)(3)

图3 主从同步配置成功

出现图3显示说明配置成功

5)解锁主数据库

unlock tables;

问题1:Slave_IO_Running为no

查看change master to后边的参数是否正确;

问题2:Slave_SQL_Running: No

开始配置显示yes ,但是操作数据库以后显示为No,这是因为对从数据库进行了写操作;

同步过程中可能出现的问题:

  1. 1049 ,检查从数据库是否存在,例如要同步的是master数据库,从库中也要存在master;
  2. 1032,我查看日志是主库删除信息的时候,从库不存在该信息;
  3. 22.编码问题,当主库是mysql8,从库是5.7的时候出现了该问题;

以上2、3其实也不算是错误,对程序的执行没有影响,可以忽略跳过。

打开从数据库mysql.ini添加指令:

slave-skip-errors=22,1032

注意:如果数据库只是从数据库,不要对该数据库进行写操作,否则会出现Slave_SQL_Running: No为no的情况;

8、双向同步,数据库即做主库也做从库

需要重复以上步骤:

不必管已经设置好的主从,把B服务器作为主库,A服务器作为从库,重新设置一下主从就可以了。

9、查看日志

当同步失败的时候,查看从库的状态,

show slave status \G

得到错误信息

php与mysql搭建网站(php手把手教你做网站)(4)

图4 查看状态得到错误信息

根据错误提示,去查看对应的日志文件,

使用mysqlbinlog查看日志,进入bin目录

mysqlbinlog --stop-position=23277 ../log/slave-bin.000009 | mysql -u root -p -P 3308

总结:

  1. 主从数据库同步之前要确保数据库完全一致,包括数据库名称和表中存储的数据;
  2. 如果使用低版本的数据库和高版本的数据库主从同步,最好是低版本的作为主库;
,