MySQL replication-fly天地
没有slave,初级操作步骤,尽量在不影响业务情况下执行备份(比如夜间执行)如果数据库使用myisam,可按下面方式操作:
shell> mysqldump --all-databases --master-data=1 > data.sql
注:--master-data参数会开启--lock-all-tables并写入change master to
如果数据库使用的是InnoDB表类型的话,则应该使用single-transcation:
shell> mysqldump --all-databases --single-transaction --master-data=1 > data.sql
在从服务器上导入数据
shell> mysql < data.sql
因为开始设置了master-data=1,所以系统会自动设置参数:MASTER_LOG_FILE和MASTER_LOG_POS,我们还需要设置剩下的参数:
mysql> CHANGE MASTER TO
MASTER_HOST='',
MASTER_USER='',
MASTER_PASSWORD='';
如果数据量很大的话,mysqldump会非常慢,此时直接拷贝数据文件能节省不少时间:
在拷贝之前要先锁定数据,然后再获得相关的日志信息(File & Position):
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
接下来拷贝数据文件时,如果是MyISAM表类型的话,直接拷贝即可;如果是InnoDB表类型的话,一定要先停止MySQL服务再拷贝,否则拷贝文件可能无法使用。把拷贝的数据文件直接复制到从服务器的数据目录。
最后还需要再指定一下日志信息:
mysql> CHANGE MASTER TO
MASTER_HOST='',
MASTER_USER='',
MASTER_PASSWORD='',
MASTER_LOG_FILE='',
MASTER_LOG_POS=;
有slave服务器,操作步骤:
stop slave sql_thread;
show slave status获取Relay_Master_Log_File和Exec_Master_Log_Pos的值
执行上面的步骤获取数据
接着在新的从服务器上设置日志信息:
mysql> CHANGE MASTER TO
MASTER_HOST='',
MASTER_USER='',
MASTER_PASSWORD='',
MASTER_LOG_FILE='',
MASTER_LOG_POS=;
接着在新从服务器上启动复制,旧服务器上启动sql线程。
show slave status;
Slave_IO_State: Waiting for master to send event (I/O线程运行状态)
Master_Host: 192.168.110.128 (master ip)
Master_User: repl (授权同步用户)
Master_Port: 3306 (连接端口)
Connect_Retry: 60 (连接失败重连间隔时间)
Master_Log_File: mysql-bin.000020 (I/O线程正在读取的master二进制日志)
Read_Master_Log_Pos: 240752 (I/O线程正在读取当前master二进制日志的位置)
Relay_Log_File: liu1-relay-bin.000007 (SQL线程正在读取的中继日志)
Relay_Log_Pos: 123892 (SQL线程正在读取当前中继日志的位置)
Relay_Master_Log_File: mysql-bin.000020 (包含最新事件由SQL线程执行的master二进制日志)
Slave_IO_Running: Yes (I/O线程是否运行,运行)
Slave_SQL_Running: No (SQL线程是否运行,不运行)
Replicate_Do_DB: (同步数据库)
Replicate_Ignore_DB: (忽略数据库)
Replicate_Do_Table: (同步表)
Replicate_Ignore_Table: (忽略表)
Replicate_Wild_Do_Table: test.% (跨数据库同步数据库)
Replicate_Wild_Ignore_Table: %.% (跨数据库忽略数据库)
Last_Errno: 0 (最近的状态码)
Last_Error: (最近的错误信息)
Skip_Counter: 0 (跳过N个events)
Exec_Master_Log_Pos: 123747 (由SQL线程执行的master二进制日志的位置)
Relay_Log_Space: 124089 (所有中继日志的大小)
Until_Condition: None (设置until,没有设置)
Until_Log_File: (同步到哪个日志)
Until_Log_Pos: 0 (读取到哪个位置)
Master_SSL_Allowed: No (允许SSL,下面的都是ssl设置)
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 (最近I/O线程返回状态码)
Last_IO_Error: (最近I/O线程返回错误信息)
Last_SQL_Errno: 0 (最近SQL线程返回状态码)
Last_SQL_Error: (最近SQL线程返回错误信息)
Master_Log_File和Read_Master_Log_Pos记录了I/O线程正在读取的master日志和位置
Relay_Master_Log_File和Exec_Master_Log_Pos记录了SQL线程正在执行的master日志和位置
Relay_Log_File和Relay_Log_Pos记录了SQL线程正在读取的中继日志和位置(对人数据没有太大作用)
注:Relay_Log_File和Relay_Log_Pos的值是中继日志中的值(程序需要的数据),SQL线程将这两个值及相应的SQL语句通过程序换算成在master二进制日志文件中的位置,即Relay_Master_Log_File和Exec_Master_Log_Pos的值(人需要的数据),即slave SQL线程正在同步的master日志位置。
判断I/O和SQL是否同步,看Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos的值是否相同。这里I/O已经读取所有master日志,但并没有完全同步数据,因为SQL线程滞后了。
参考文章
http://huoding.com/2011/04/05/59/comment-page-2#comments
http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html
http://dev.mysql.com/doc/refman/5.1/en
页:
[1]