Mysql主从复制 (suse 11 sp2)

Mysql主从复制 (suse 11 sp2)
Mysql主从复制步骤很简单,仔细看,你一定懂

环境:
A: 10.12.241.151 作为master,没有数据

B: 10.12.241.150  作为slave,没有数据
以下是在机器Client的root和机器Server的root之间建立安全信任关系的步骤:

主备互信
1. 在机器Client上root用户执行ssh-keygen命令,生成建立安全信任关系的证书。

[root@Client root]# ssh-keygen -b 1024 -t rsa

[root@Client root]#注意:在程序提示输入passphrase时直接输入回车,表示无证书密码。

上述命令将生成私钥证书id_rsa和公钥证书id_rsa.pub,存放在用户家目录的.ssh子目录中。
mysql-slave:~/.ssh # cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAxUteRy+XN1S8U6fiMP9NPLSbLhoYcDyHn+efCJUrvq14SavgtvSBTmuU8+hHho9Q/1XzSlxks7cQfTkBvU7kIe5Aec++lIZDAILyrpD8FVX8oNCQsXAYWNOZxDdusUAVu
krQ5gSNlVIgsH2OKjseDxZ/kNQ+sHKdfGx9pgNv05s= root@mysql-slave

2. 将公钥证书id_rsa.pub复制到机器Server的root家目录的.ssh子目录中,同时将文件名更换为authorized_keys。
 或者直接复制id_rsa.pub 内容即可
[root@Client root]# scp -p .ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
[email protected]'s password:          <-- 输入机器Server的root用户密码
id_rsa.pub           100% |**************************|   218       00:00
[root@Client root]#在执行上述命令时,两台机器的root用户之间还未建立安全信任关系,所以还需要输入机器Server的root用户密码。

经过以上2步,就在机器Client的root和机器Server的root之间建立安全信任关系。下面我们看看效果:



关闭suse 11 sp2防火墙
临时关闭防火墙,重启失效

或者chkconfig --level B SuSEfirewall2_init off (设置防火墙默认关闭状态,重启生效)

一:主服务器上:
注意:mysql参数

  binlog-do-db = 数据库名      (你要备份的数据库)
  binlog-ignore-db = 数据库名  (你不需要备份的数据库)
  如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库


 (1) 确保/etc/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。假如没有如下参数,自己手动添加,并重启mysql服务器
   [mysqld]   
   log-bin=mysql-bin (启动二进制文件)
    server-id=1  (服务器ID)
  ( 2 ) :登录mysql服务器,添加一个叫做beifen的用户,并授权给从服务器
[root@localhost ~]# mysql -uroot �Cp123456 登录mysql 
这里需要指明一下啊 这个123456是我的mysql的密码
mysql> grant replication slave on *.* to 'beifen'@'10.12.241.150' identified by '123'; 创建 beifen用户,密码设置为123  并授权给10.12.241.150使用。
mysql>grant select,insert,update,delete on *.* to beifen@"%" Identified by "123";
mysql>set global server_id=1;
mysql>flush privileges;             # 刷新
   ( 3 )查询主数据库的状态,并记下File和Position的值,这个在配置从数据库的时候用的到

 mysql> show master status \G;
*************************** 1. row ***************************
            File: mysql-bin.000001
        Position: 98
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)



二:从服务器上
(1) 修改配置文件/etc/my.cnf 将service-id=1修改为server-id=2
(2) 并重启mysql服务器
[root@localhost ~]# mysqladmin -p123456 shutdown
[root@localhost ~]# mysqld_safe --user=mysql &

(3)登录mysql服务器
[root@localhost ~]# mysql -uroot �Cp123456
mysql>change master to master_host='10.11.241.155', master_user='beifen', master_password='123',master_log_file='mysql-bin.000004',master_log_pos=98;

( 4 ) 启动slave同步
mysql > start slave;

(5) 检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。

mysql > show slave status\G
如下图:


OK! 主从复制完成,现在可以去验证了
验证方法:去主服务器上新建一个数据库,然后登录从服务器看看刚才在主服务器新建的数据库在不在


注意:如果master服务器上做主从之前已经有数据了,我们就必须要把数据库导出来  然后导入从数据库 (方法多种)

导数据之前:
进行锁表操作,不让数据进行写入动作,这么做事为了防止从数据库的原始数据和主数据库的原始数据不一致。

mysql> flush tables with read lock;
记住数据导完后要解锁:
mysql> unloclk tables; 

然后用导出数据,再把导出的数据导入从数据库

但是大家有没有想到一个问题,如果从数据库有很多台,并且数据库很大的情况下,这样做的严重影响效率

最好的方法是:先将主服务器上面的数据用mysqldump命令导出来备份,然后删掉那个数据库,等搭建好主从之后,在主服务器上面新建原来的那个数据库,然后用mysql命令导入开始备份的数据、这时再去看看从服务器上面是不是有那哥数据库的数据。



如果执行
  遇到这种情况

可以用这个语句试一下

Mysql > stop slave;
Mysql > set global sql_slave_skip_counter =1 ; (让mysql跳过一次错误,继续执行)
Mysql > start slave;

 

 

mysql主从同步,show slave status命令,结果详解 

mysql> show slave status\G;
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event  #等待master发生事件
                 Master_Host: 192.168.16.42   #同步master服务器IP地址
                 Master_User: rsync#建立同步使用用户
                 Master_Port: 3306#master服务器mysql使用端口
               Connect_Retry: 60#连接重拾时间
             Master_Log_File: mysql-bin.000001#I/O线程当前正在读取的主服务器二进制日志文件的名称
         Read_Master_Log_Pos: 107#本机I/O线程读取主服务器二进制日志位置
              Relay_Log_File: 3306-relay-bin.000002#SQL线程当前读取执行的中继日志文件的名称
               Relay_Log_Pos: 253#SQL线程读取执行中继日志的位置
       Relay_Master_Log_File: mysql-bin.000001#由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
            Slave_IO_Running: Yes#I/O线程是否启动并成功连接到主服务器上
           Slave_SQL_Running: Yes#SQL线程是否启动
             Replicate_Do_DB: #设置从master服务器进行同步的数据库,通过replicate-do-db选项设置
         Replicate_Ignore_DB: mysql,test,information_schema  #设置不从master端进行数据同步的数据库,replicate-ignore-db选项设置
          Replicate_Do_Table: #设置从master服务器进行同步的表,通过replicate-ignore-table选项设置
      Replicate_Ignore_Table: #设置不从master端进行数据同步的表,replicate-ignore-table选项设置
     Replicate_Wild_Do_Table: #告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。模式可以包含‘%’和‘_’通配符,与LIKE模式匹配操作符具有相同的含义。要指定多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。请读取该选项后面的注意事项。例如:--replicate-wild-do-table=foo%.bar%只复制数据库名以foo开始和表名以bar开始的表的更新。
 Replicate_Wild_Ignore_Table: #告诉从服务器线程不要复制表匹配给出的通配符模式的语句。要想忽略多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。请读取该选项后面的注意事项。例如:--replicate-wild-ignore-table=foo%.bar%不复制数据库名以foo开始和表名以bar开始的表的更新。
                  Last_Errno: 0#最近的一次错误码
                  Last_Error: #最近一次错误码的内容
                Skip_Counter: 0#最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值,例如:SET GLOBAL SQL_slave_SKIP_COUNTER = n;
         Exec_Master_Log_Pos: 107#SQL线程执行来自master的二进制日志最后一个事件位置
             Relay_Log_Space: 408#所有原有的中继日志结合起来的总大小
             Until_Condition: None#复制until条件,在stop slave,start slave(不带until)或server重启的时候会自动重置
              Until_Log_File: #复制停止的文件名
               Until_Log_Pos: 0#复制停止的文件位置
          Master_SSL_Allowed: No#是否使用SSL连接master,如果允许对主服务器进行SSL连接,则值为Yes。如果不允许对主服务器进行SSL连接,则值为No。如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored。
          Master_SSL_CA_File: #ssl agent文件ca-cert.pem的文件名,配置文件master-ca选项设置
          Master_SSL_CA_Path: #ssl agent文件ca-cert.pem的路径名,配置文件ca-cert.pem选项设置
             Master_SSL_Cert: #ssl 授权文件,配置文件master-cert选项设置
           Master_SSL_Cipher: #ssl 加密算法,配置文件master-cipher选项设置
              Master_SSL_Key: #ssl 密钥文件,配置文件master-key选项设置
       Seconds_Behind_Master: 0#本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。
#总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。如果主服务器和从属服务器之间的网络连接较快,则从属服务器I/O线程会非常接近主服务器,所以本字段能够十分近似地指示,从属服务器SQL线程比主服务器落后多少。
#如果网络较慢,则这种指示不准确;从属SQL线程经常会赶上读取速度较慢地从属服务器I/O线程,因此,Seconds_Behind_Master经常显示值为0。即使I/O线程落后于主服务器时,也是如此。换句话说,本列只对速度快的网络有用。即使主服务器和从属服务器不具有相同的时钟,时间差计算也会起作用(当从属服务器I/O线程启动时,计算时间差。并假定从此时以后,时间差保持不变)。
#如果从属SQL线程不运行,或者如果从属服务器I/O线程不运行或未与主服务器连接,则Seconds_Behind_Master为NULL(意义为“未知”)。举例说明,如果在重新连接之前,从属服务器I/O线程休眠了master-connect-retry秒,则显示NULL,因为从属服务器不知道主服务器正在做什么,也不能有把握地说落后多少。本字段有一个限制。时间标记通过复制被保留,这意味着,如果一个主服务器M1本身是一个从属服务器M0,则来自M1的binlog的任何事件(通过复制来自M0的binlog的事件而产生),与原事件具有相同的时间标记。这可以使MySQL成功地复制TIMESTAMP。
#但是,Seconds_Behind_Master的缺点是,如果M1也收到来自客户端的直接更新,则值会随机变化,因为有时最近的M1时间来自M0,有时来自直接更新,最近的时间标记也是如此。
Master_SSL_Verify_Server_Cert: No#是否检查master的授权文件
               Last_IO_Errno: 0#IO thread的上一次出错的错误号
               Last_IO_Error: #IO thread的上一次出错的错误信息
              Last_SQL_Errno: 0#SQL thread的上一次出错的错误号
              Last_SQL_Error: #SQL thread的上一次出错的错误信息
 Replicate_Ignore_Server_Ids: #忽略复制服务器ID
            Master_Server_Id: 2#master 主机server ID


 

你可能感兴趣的:(用户,证书,master,程序,密码)