Mysql的主从服务器mysql
对于公司数据库的须要,咱们有时须要创建主从服务器,在这里我给你们演示两个创建过程,一个是对于一个全新的主从服务器的创建(即数据库里尚未存在任何数据信息),另外一个是在有数据信息的基础上创建从服务器。sql
在演示以前,先简单介绍一个主从服务器的相关知识:数据库
从服务器是如何实现经过主服务器实现数据复制的:主服务器经过dump线程将主服务器上的二进制日志传递给了从服务器,从服务器将此二进制日志变成本身的中继日志,在经过I/O线程将中继日志传递给本机上的SQL线程,本机经过SQL线程写入数据,来实现数据的复制。 vim
注意事项:服务器
每一个服务器都有惟一的service IDide
在主服务器上须要创建从服务器复制数据用的帐号spa
如果在互联网上传输须要利用ssl线程
做为从服务器,其数据库的版本不能比主服务器低,以避免一些SQL命令用到的功能不能在从服务器上执行 日志
案例一:全新的没有任何数据orm
前提:两台主机上都安装好了mysql,其可以正常启动,
在主服务器上执行如下操做
[root@mail ~]# vim /etc/my.cnf
innodb_file_per_table=1 可添加以下一行使mysql的每一个表有本身独立的空间
[root@mail ~]# service mysqld start 启动mysql
Starting MySQL..... [ OK ]
mysql> grant replication client,replication slave on *.* to repl@'172.16.%.%' identified by 'redhat'; 在主服务器上添加从服务器可使用的本地用户,使他对于全部数据库的全部表有权限,其用户名是repl,主机地址是172.16网段的全部地址,密码是redhat
mysql> flush master; 清空主服务器日志
在从服务器上执行如下操做
[root@localhost ~]# vim /etc/my.cnf 修改mysql的配置文件信息
server-id = 11 不能和主服务器的service ID同样
#log-bin=mysql-bin 关闭二进制日志,是否关闭能够根据本身的需求决定
relay-log=relay-bin 开启了中继日志的功能
relay-log-index=relay-bin.index
innodb_file_per_table=1
[root@localhost ~]# service mysqld start 启动mysql
mysql> flush slave; 清空从服务器日志
mysql>change master to master_host='172.16.19.9',master_user='repl',master_password
='redhat'; 指定其主服务器是172.16.19.9上的数据库,复制数据时使用的帐号和密码
mysql> start slave; 开启从服务器
mysql> show slave status\G; 若这两个运行状态都为yes,则主从服务器创建成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
能够验证一下是否真正成功
mysql> create database feng; 在主服务器上建立数据库
Query OK, 1 row affected (0.00 sec)
mysql> show databases; 在从服务器上查看
+--------------------+
| Database |
+--------------------+
| information_schema |
| feng |
| mysql |
| performance_schema |
| test |
+--------------------+
显示出这个表中包含在主服务器上建立的数据库feng,则恭喜你全新的主从服务器建立成功。
案例二:给已经有数据的数据库创建从服务器
在主服务器上执行如下操做
mysql> grant replication client,replication slave on *.* to repl@'172.16.%.%' identified by 'redhat'; 在主服务器上添加用户
mysql> flush logs;
[root@mail ~]# mysqldump --all-databases --lock-all-tables --master-data=2 >/tmp/all-slave.sql 因为个人也是在虚拟机上新建的mysql, root用户尚未密码,全部执行了这样的命令,
若你的mysql已经有密码,执行的命令则以下
# mysqldump -uroot -p'redhat' --all-databases --lock-all-tables --master-data=2 >/tmp/all-slave.sql 将数据保存到/tmp/all-slave.sql
mysqldump是数据库备份命令,-u后跟用户,-p后跟密码
--all-databases 指定全部的数据库
--lock-all-tables 并对全部的表上锁
--master-data=2 在备份的时候导出二进制文件的位置
在从服务器上执行如下操做
将在主服务器上备份的文件all-slave.sql,移动到从服务器的/tmp目录下
[root@localhost ~]# vim /etc/my.cnf 修改如下信息
server-id = 11
#log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin.index
innodb_file_per_table=1
[root@localhost ~]# service mysqld start 启动mysql
Starting MySQL.. [ OK ]
[root@localhost ~]# head -30 /tmp/
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=183;
查看文件all-slave.sql,记住以下行从哪一个二进制日志开始到哪一个点
mysql> source /tmp/all-slave.sql; 载入一些备份的数据库
mysql>change master to master_host='172.16.19.9',master_user='repl',master_password
='redhat',master_log_file='mysql-bin.000003',master_log_pos=183;
此处在指定主服务器的时候还要指出从哪一个日志的哪一个点开始
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| extmail |
| feng |
| haha |
| jiaowu |
| jun |
| mydb |
| mysql |
| performance_schema |
| test |
+--------------------+
10 rows in set (0.00 sec)
经过数据库能够看出备份的数据再入成功
能够验证是否主从服务器真正创建成功
在主服务上执行下面的命令
mysql> show slave hosts; 显示有哪些从服务器
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
| 11 | | 3306 | 1 |
+-----------+------+------+-----------+
若是你能看到这个表格,一样恭喜你,主从服务器你也已经穿件成功了。
对于这样建立主从服务器,其实还存在一些隐患的,从服务器能够写入数据的,严格来讲从服务器是不容许写入数据的,因此主从服务器可使用如下配置:
主服务器:
sync_binlog=1 任何事务提交以后都要写入二进制文件
innodb_flush_logs_at_trx_commit=1 在事务提交的时候将日志当即写入磁盘
这两项来解决服务器忽然崩溃形成事务提交但没有写入二进制日志的问题
从服务器:
skip_slave_start=1 定义mysql启动时不自动进入从服务器线程
read_only=1 定义从服务没有本身写数据的权限
relay-log=relay-bin 开启了中继日志的功能
relay-log-index=relay-bin.index
replicate_do_db=db_name 定义从服务器对哪些数据库进行复制
rpplicate_ignore_db=db_name 定义从服务器不给哪些数据库经行复制
replicate_do_table=tb_name 对表的限制
replicate_ignore_table=tb_name
replicate_wild_do_table=mageedu.tb% 对那些表的限制
replicate_wild_ignore_table
若能够对多个数据库复制则要使用一些格式
replicate_do_db=db_name1
replicate_do_db=db_name2