来源:自学PHP网 时间:2015-04-16 10:51 作者: 阅读:次
[导读] 主从的作用:1 可以当做一种备份方式2 用来实现读写分离,缓解一个数据库的压力MySQL主从备份原理:Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服...
主从的作用: 1.可以当做一种备份方式 2.用来实现读写分离,缓解一个数据库的压力
MySQL主从备份原理: Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。 如果想配置成为同一台上的话,注意安装的时候,选择两个不同的prefix=路径,同时开启服务器的时候,端口不能相同。 (1)首先确保主从服务器上的Mysql版本相同(做主从服务器的原则是,MYSQL版本要相同,如果不能满足,最起码从服务器的MYSQL的版本必须高于主服务器的MYSQL版本 ) (2)在主服务器上,设置一个从数据库的账户,使用REPLICATION SLAVE赋予权限,如:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave001'@'192.168.0.99' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.13 sec) [原理]master 上提供binlog , slave 通过 I/O线程从 master拿取 binlog,并复制到slave的中继日志中 slave 通过 SQL线程从 slave的中继日志中读取binlog ,然后解析到slave中
主从复制大前提 需要master与slave同步,因为笔者的数据库数据量不大,所以无需考虑太多,直接把 master上的data复制到了slave上,但是如果是大的数据量,比如像taobao这个的系统 那么数据同步也是很难得,需要有一个完善的方案,有兴趣的可以看看这篇文章 http://www.taobaodba.com/html/564_%E5%A2%9E%E9%87%8F%E6%97%A5%E5%BF%97%E8%BF%AD%E4%BB%A3%E5%90%8C%E6%AD%A5%E5%92%8C%E9%98%BF%E5%9F%BA%E9%87%8C%E6%96%AF%E6%82%96%E8%AE%BA.html
实验环境准备: OS: CentOS5.4 Mysql:Mysql-5.0.41.tar.gz 两台测试IP&服务器:
安装配置步骤:
1、首先在Linux环境下分配好磁盘分区以便留足MySQL数据库的备份空间 [root@vps mysql]# df -h
2、MySQL数据库的安装: 1>将Mysql-5.0.41.tar.gz通过SSH 工具 上传到Linux系统的home目录下 3、配置MySQL5.0的复制(Replication)功能
一.将master设置为只读。 mysql> flush tables with read lock; 二.用master中的data文件夹替换slave中的data文件夹 比如 用 tar zcvf mysql_data.gz /media/raid10/mysql/3306/data 然后 mv mysql_data.gz /media/raid10/htdocs/blog/wordpress/ 因为我的 /media/raid10/htdocs/blog/wordpress/ 是 Nginx 的主目录 所以可以在 slave上,用wget下载这个文件,然后 解压,并覆盖slave上的data文件 注意:覆盖之前最好备份源文件
三.配置master的my.cnf,添加以下内容
在[mysqld]配置段添加如下字段 server-id=1 log-bin=/media/raid10/mysql/3306/binlog/binlog //这里写你的binlog绝对路径名 binlog-do-db=blog //需要同步的数据库,如果没有本行,即表示同步所有的数据库 binlog-ignore-db=mysql //被忽略的数据库
这里给出我的my.cnf配置文件 [client] character-set-server = utf8 port = 3306 socket = /tmp/mysql.sock
[mysqld] character-set-server = utf8 replicate-ignore-db = mysql replicate-ignore-db = test replicate-ignore-db = information_schema user = mysql port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/webserver/mysql datadir = /media/raid10/mysql/3306/data log-error = /media/raid10/mysql/3306/mysql_error.log pid-file = /media/raid10/mysql/3306/mysql.pid open_files_limit = 10240 back_log = 600 max_connections = 5000 max_connect_errors = 6000 table_cache = 614 external-locking = FALSE max_allowed_packet = 16M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 300 #thread_concurrency = 8 query_cache_size = 20M query_cache_limit = 2M query_cache_min_res_unit = 2k default-storage-engine = MyISAM thread_stack = 192K transaction_isolation = READ-COMMITTED tmp_table_size = 20M max_heap_table_size = 20M long_query_time = 3 log-slave-updates log-bin = /media/raid10/mysql/3306/binlog/binlog binlog-do-db=blog binlog-ignore-db=mysql
binlog_cache_size = 4M binlog_format = MIXED max_binlog_cache_size = 8M max_binlog_size = 20M relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog relay-log = /media/raid10/mysql/3306/relaylog/relaylog expire_logs_days = 30 key_buffer_size = 10M read_buffer_size = 1M read_rnd_buffer_size = 6M bulk_insert_buffer_size = 4M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 20M myisam_repair_threads = 1 myisam_recover
interactive_timeout = 120 wait_timeout = 120
skip-name-resolve #master-connect-retry = 10 slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
#master-host = 192.168.1.2 #master-user = username #master-password = password #master-port = 3306
server-id = 1
innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 20M innodb_data_file_path = ibdata1:56M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M innodb_log_file_size = 20M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0
#log-slow-queries = /media/raid10/mysql/3306/slow.log #long_query_time = 10
[mysqldump] quick max_allowed_packet = 32M
四.在master机上为slave机添加一同步帐号 mysql> grant replication slave on *.* to 'admin'@'172.29.141.115' identified by '12345678'; mysql> flush privileges ;
五.配置slave的my.cnf,添加以下内容 注意: 1.如果mysql是5.5.3-m3 的版本,只需 在[mysqld]字段下添加如下内容 server-id=2
2.如果是5.0x的版本,需要 在[mysqld]字段下添加如下内容 server-id=2 log-bin=mysql-bin //这是同步的binlog,具体以你的binlog为准 master-host=172.29.141.112 master-user=admin master-password=12345678 master-port=3306 master-connect-retry=60 //如果发现主服务器断线,重新连接的时间差; replicate-do-db=blog //同步的数据库,不写本行 表示 同步所有数据库 replicate-ignore-db=mysql //不需要备份的数据库 log-slave-update slave-skip-errors
我的mysql是5.5.3,这里给出我的slave my.cnf配置文件 [client] character-set-server = utf8 port = 3306 socket = /tmp/mysql.sock
[mysqld] character-set-server = utf8 replicate-ignore-db = mysql replicate-ignore-db = test replicate-do-db = blog replicate-ignore-db = information_schema user = mysql port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/webserver/mysql datadir = /media/raid10/mysql/3306/data log-error = /media/raid10/mysql/3306/mysql_error.log pid-file = /media/raid10/mysql/3306/mysql.pid open_files_limit = 10240 back_log = 600 max_connections = 5000 max_connect_errors = 6000 table_cache = 614 external-locking = FALSE max_allowed_packet = 16M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 300 #thread_concurrency = 8 query_cache_size = 20M query_cache_limit = 2M query_cache_min_res_unit = 2k default-storage-engine = MyISAM thread_stack = 192K transaction_isolation = READ-COMMITTED tmp_table_size = 20M max_heap_table_size = 20M long_query_time = 3 log-slave-updates log-bin = /media/raid10/mysql/3306/binlog/binlog binlog_cache_size = 4M binlog_format = MIXED max_binlog_cache_size = 8M max_binlog_size = 20M relay-log-index = /media/raid10/mysql/3306/relaylog/relaylog relay-log-info-file = /media/raid10/mysql/3306/relaylog/relaylog relay-log = /media/raid10/mysql/3306/relaylog/relaylog expire_logs_days = 30 key_buffer_size = 10M read_buffer_size = 1M read_rnd_buffer_size = 6M bulk_insert_buffer_size = 4M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 20M myisam_repair_threads = 1 myisam_recover interactive_timeout = 120 wait_timeout = 120
skip-name-resolve #master-connect-retry = 60 slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
#master-host=172.29.141.112 #master-user = admin #master-password = 12345678 #master-port = 3306 server-id = 2 innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 20M innodb_data_file_path = ibdata1:56M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M innodb_log_file_size = 20M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0
#log-slow-queries = /media/raid10/mysql/3306/slow.log #long_query_time = 10
[mysqldump] quick max_allowed_packet = 32M
六.通过查看master的状态(在master上查看),为配置slave做准备 mysql> show master status/G; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 13 Current database: blog *************************** 1. row *************************** File: binlog.000005 Position: 592 Binlog_Do_DB: blog Binlog_Ignore_DB: mysql 1 row in set (0.01 sec)
ERROR: No query specified
从上面的信息,可以看出,master现在使用的binlog是binlog.000005,position是592,那么下面的slave配置必须与这个对应。
其实binlog.000005是当前master使用的binlog日志文件 position是当前master使用的binlog.000005日志文件的位置 简单理解为master正在使用哪个binlog的哪个数据行(位置)。
七.如果是5.5.3-m3版本mysql,需要启动slave后,配置与master相关对应的信息(在slave上配置) 注意,这个与第六步相对应
mysql> stop slave ; mysql> change master to master_host='172.29.141.112', master_user='admin', master_password='12345678', master_log_file='binlog.000005', master_log_pos=488;
mysql> CHANGE MASTER TO MASTER_CONNECT_RETRY=60;
这个与5.0的配置my.cnf作用是一样的,配置成与master相对应的内容 主要是配置slave,让slave知道从master的哪个binlog上的哪个位置复制数据。所以需要知道master的ip,user_name,user_passwd,binlog,binlog_position以及多长时间连接一次master
八.开启slave mysql> start slave;
九.解除master只读限制,并做测试 mysql> unlock tables; mysql> use blog; mysql> create longxibendi ( a int, b int );
十.从slave上查看 mysql> use blog; mysql> show tables; +-----------------------+ | Tables_in_blog | +-----------------------+ | longxibendi | | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_terms | | wp_usermeta | | wp_users | +-----------------------+ 12 rows in set (0.00 sec)
可以看到成功了!!
十一.配置过程中,可以用 show slave status/G; 在 slave上 查看 slave的复制情况 十二.如果出现什么问题,可能是防火墙的问题 /etc/init.d/iptables stop 关闭 master 上的防火墙,或者进行相应的配置 常遇到的错误与解决: 1.[mysql]ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 这个错误,网上有很多说法,其实直接的原因是mysql服务器没有启动 之前我按照5.0x配置master-slave,然后启动slave,在连接slave,就会报这个错误 后来发现原因是,mysql slave没有启动起来,然后去查错误日志,发现以下的字段 110505 01:55:20 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended 110505 02:04:41 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data InnoDB: The InnoDB memory heap is disabled InnoDB: Mutexes and rw_locks use InnoDB's own implementation 110505 2:04:41 InnoDB: highest supported file format is Barracuda. 110505 2:04:41 InnoDB Plugin 1.0.6 started; log sequence number 44338 110505 2:04:41 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-connect-retry=60' 110505 2:04:41 [ERROR] Aborting 110505 2:04:41 InnoDB: Starting shutdown... 110505 2:04:43 InnoDB: Shutdown completed; log sequence number 44348 110505 2:04:43 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete
110505 02:04:43 mysqld_safe mysqld from pid file /media/raid10/mysql/3306/mysql.pid ended 110505 02:07:44 mysqld_safe Starting mysqld daemon with databases from /media/raid10/mysql/3306/data InnoDB: The InnoDB memory heap is disabled InnoDB: Mutexes and rw_locks use InnoDB's own implementation 110505 2:07:44 InnoDB: highest supported file format is Barracuda. 110505 2:07:45 InnoDB Plugin 1.0.6 started; log sequence number 44348 110505 2:07:45 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-host=172.29.141.112' 110505 2:07:45 [ERROR] Aborting 从上面的ERROR,知道 master-connect-retry=60这个my.cnf中的参数有问题,后来从网上搜资料,发现,mysql5.5.3-m3版本不支持这个参数, 然后我把这个参数注释掉,又发现不支持这个参数master-host,从上面的ERROR字段可以看出来。后来,就知道,5.5.3-m3不能按5.0.x那样配置 原来不需要从my.cnf中配置master相关信息,当然server-id是必须的。其他信息,通过 在命令行中 ,登陆 mysql服务器配置。 其实server-id的作用是 第一,标识,区分不同的slave,第二,防止环备份的发生
2.Last_Error: Last_SQL_Error:等错误 这个是从 slave上,运行 show slave status/G; 得到的。出现这个问题,最根本的原因是,slave 没有与当前的master的binlog 和binlog的position对应上 也就是说,slave传输的master binlog 不与当前master正使用的binlog以及binlog的行数对应。
3.[ERROR] Slave I/O: error connecting to master 'admin@172.29.141.112:3306' - retry-time: 60 retries: 86400, Error_code: 2003 这个就是因为防火墙的问题,所以用 /etc/init.d/iptables stop 关闭防火墙就OK了。
4.遇到ERROR 2013 (HY000): Lost connection to MySQL server during query错误。
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com