Mysql(Mariadb) 5.5 及以上版本配置数据库主从与 5.1 有所不同
主库:192.168.30.101
从库:192.168.30.102
vim /etc/my.conf(编辑你自己的数据库配置文件就好) 在 [mysqld] 下设置如下参数:
server-id=101 #主库标识 通常用IP主机位就好 log_bin=mysql-bin #开启mysql二进制日志(从库能复制主库就是通过读取此日志的操作记录来实现的) binlog-do-db=my_user #要复制的数据库 多个的话可以设置多条 每条一行 binlog-ignore-db=mysql #忽略的数据库
保存退出,重启服务,查看主机二进制日志状态
service mariadb restart #重启一下服务 我装的是 mariadb 各位灵活应对 mysql -u root -p show master status; #查看主服务器状态 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 3129 | osyunweidb | mysql | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
为从服务器开通帐号,用户名 slave_db 限定ip,只赋予复制权限
#这里不要限定 db_name.* 否则回报错 数据库的限定已经在配置文件中了 grant replication slave on *.* to 'slave_db'@'192.168.30.102' identified by '123456' with grant option; flush privileges;
vim /etc/my.conf(编辑你自己的数据库配置文件就好) 在 [mysqld] 下设置如下参数:
vi /etc/my.cnf server-id=102 #从库标识位 log-bin=mysql-bin replicate-do-db=my_user replicate-ignore-db=mysql
保存退出,重启服务
service mariadb restart #重启一下服务 我装的是 mariadb 各位灵活应对 mysql -u root -p slave stop; # 停止从库功能 change master to master_host='192.168.30.101',master_user='slave_db',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=3129;#设置同步参数 主机 用户名 密码 二进制文件 文件位置 slave start; # 启动从库功能 show slave status \G #查看从库状态
正常配置的话此时从库就可以开始通过读取主库的二进制日志进行同步了
Slave_IO_Running: Yes Slave_SQL_Running: Yes
Slave_IO_Running 是指读取主库二进制日志的进程状态 Slave_SQL_Running 是指从库执行二进制日志的状态
这两项都为 yes 的话就说明从库读主库的二进制操作日志并且在本机同步执行,自然就实现了主从复制的功能
从库是通过读取主库的bin-log来实现同步的,所以只能自动同步主库记录到bin-log中的数据操作,在主库开启bin-log之前的数据只能通过手动导入了
比如主库一直开启 bin-log,从数据库创建 表创建 数据写入,那则我们可以通过一下操作做到热同步从库
flush table with read lock; #在主库中执行此命令 让写操作去排队 将内存中的数据全都回写硬盘 #....前往从库执行.... unlock tables; #解除锁定
主库加锁后来从库执行以下命令(记得配置好主从)
slave start; #开启从库,此时从库会去主库读取bin-log做同步 将数据库创建等一系列操作完成
这样的话就能保证数据的一致性,防止同步时主库被重写,造成数据的不完整性
如果是运行了一段时间了主库才开启了 bin-log,则从库做同步需要手动导入之前的数据,如果不能停机的话就只能开二进制,进主库,加读锁,导出数据到本地,从库导入,从库开slave,主库开锁
1) Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
全局权限不能用于某特定的数据库,这个问题大部分是在你设置从库的访问用户名密码时
grant replication slave on *.* to 'slave_db'@'192.168.30.102' with grant option
这里是不能指定某数据库的,因为 replication slave 是全局权限,至于从复制那些数据库 my.cnf 里面已经限定好了