主从复制原理:复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。 1)主服务器将所有数据和结构更改记录到二进制日志中。 2)从属服务器从主服务器请求该二进制日志并在本地应用其内容。 3)IO:请求主库,获取上一次执行过的新的事件,并存放到relaylog 4)SQL:从relaylog中将sql语句翻译给从库执行
本次搭建在同一台机器上搭建,用不同用户和不同端口以及不同程序路径。安装过程比较简单,采用二进制的方式来做的。
主库搭建:
加入环境变量:
export MYSQL_HOME=/opt/mysql
export PATH=$PATH:$MYSQL_HOME/bin
主库的配置文件: [mysql] no-auto-rehash port = 3306 socket = /opt/data/mysqld.sock [mysqld] user = mysql port = 3306 basedir = /opt/mysql datadir = /opt/data socket = /opt/data/mysqld.sock pid-file = mysql.pid character-set-server = utf8 skip_name_resolve = 1 lower_case_table_names=1 max_connections = 1000 max_connect_errors = 1000000 table_open_cache = 4000 table_definition_cache = 4000 table_open_cache_instances = 64 max_allowed_packet = 32M sort_buffer_size = 16M join_buffer_size = 16M thread_cache_size = 450 query_cache_size = 0 query_cache_type = 0 interactive_timeout = 600 wait_timeout = 600 tmp_table_size = 96M max_heap_table_size = 96M general_log=1 general_log_file=general.log slow_query_log = 1 slow_query_log_file = /opt/log/slow.log log_error = /opt/log/error.log long_query_time =1 server-id = 170 log_bin = mysql-bin log_slave_updates=on sync_binlog = 1 binlog_cache_size = 4M max_binlog_cache_size = 2G max_binlog_size = 1G expire_logs_days = 7 master_info_repository = TABLE relay_log_info_repository = TABLE binlog_format = row key_buffer_size = 32M read_buffer_size = 8M read_rnd_buffer_size = 16M lock_wait_timeout = 3600 innodb_thread_concurrency = 0 transaction_isolation = REPEATABLE-READ innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 8 innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 32M innodb_log_file_size = 2G innodb_log_files_in_group = 3 当时启动主库的时候会有个错误:
查看error.log后:
原因是配置参数的问题,自动扩展配置参数设置的太大导致。
主库初始化:mysqld --initialize --user=mysql --datadir=/opt/data --basedir=/opt/mysql --socket=/opt/data/mysqld.sock bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data # Before MySQL 5.6 bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data # MySQL 5.7 and up update mysql.user set authentication_string=password('L*Rb0!gtigergao!@#') where user='root' and Host = 'localhost' 初始化主库后启动mysql服务进行登录,必须要先修改密码: ALTER USER "root"@"localhost" IDENTIFIED BY "shsnc!@#"; flush privileges;
登录主库创建主从同步用户: create user 'tigergao' identified by 'tigergao';
赋权:grant replication slave on *.* to tigergao@'10.131.156.%' identified by 'tigergao';
记录binlog位置:
主库配置完毕,需要进行配置从库。
注意:由于我是在同一台机子上做的主从,主库采用的做了软链后用service mysql start的方式启动的,由于担心同时做软链会发生冲突,所以从库用命令的方式启动的。
从库配置:
加入环境变量
export MYSQL_HOME=/data/mysql export PATH=$PATH:$MYSQL_HOME/bin 从库的配置: [mysql] no-auto-rehash port = 3309 socket = /data/data/mysqldbs.sock [mysqld] user = mysql01 port = 3309 basedir = /data/mysql datadir = /data/data socket = /data/data/mysqldbs.sock pid-file = mysqldbs.pid character-set-server = utf8 skip_name_resolve = 1 lower_case_table_names=1 max_connections = 1000 max_connect_errors = 1000000 table_open_cache = 4000 table_definition_cache = 4000 table_open_cache_instances = 64 max_allowed_packet = 32M sort_buffer_size = 16M join_buffer_size = 16M thread_cache_size = 450 query_cache_size = 0 query_cache_type = 0 interactive_timeout = 600 wait_timeout = 600 tmp_table_size = 96M max_heap_table_size = 96M general_log=1 general_log_file=general.log slow_query_log = 1 slow_query_log_file = /data/log/slow.log log_error = /data/log/error.log long_query_time =1 server-id = 175 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin log_slave_updates=on sync_binlog = 1 binlog_cache_size = 4M max_binlog_cache_size = 2G max_binlog_size = 1G expire_logs_days = 7 master_info_repository = TABLE relay_log_info_repository = TABLE binlog_format = row key_buffer_size = 32M read_buffer_size = 8M read_rnd_buffer_size = 16M lock_wait_timeout = 3600 innodb_thread_concurrency = 0 transaction_isolation = REPEATABLE-READ innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 8 innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 32M innodb_log_file_size = 2G innodb_log_files_in_group = 3 从库采用命令启动指定配置文件: /usr/local/mysql/bin/mysqld_safe --defaults-extra-file=/etc/my3306.cnf --datadir=/mysql3306 --user=mysql & 从库初始化: mysqld --initialize --user=mysql01 --datadir=/data/data --basedir=/data/mysql --socket=/data/data/mysqldbs.sock 从库启动:指定配置文件的方式启动 /data/mysql/bin/mysqld_safe --defaults-extra-file=/data/mysql/conf/my.cnf --datadir=/data/data --basedir=/data/mysql --user=mysql01 &
ps -ef | grep -i mysql |grep -v grep 查看进程,3306和3309都已经起来了。
设置主从:
设置主从:需要在从库上执行 change master to master_host='主库ip'; change master to master_port=3306; change master to msater_user='tigergao'; change master to master_password='tigergao'; change master to master_log_file='mysql-bin.000001'; change master to master_log_pos=1097; 开启主从:startslave
在从库上查看sql线程和io线程是否成功应用,如果已应用代表就是成功了。show slave status \G;
验证主从,在主库上创建数据库:tigergao;在数据库tigergao中创建一张学生表并插入数据。
然后在从库上查看:
可以看到从库已经把数据库和表以及数据都同步过来了。分别去查看主库和从库的数据目录下的数据。
主从已经搭建成功。
主从复制基本故障处理 IO线程 ++ 连接主库 ++ 1)user password ip port 2)网络:不通,延时高,防火墙 ++ 请求binlog ++ 1)binlog不存在或者损坏 ++ 更新relay-log和master.info ++ SQL线程 1)relay-log出现问题 2)从库做写入了 操作对象已存在(create) 操作对象不存在(insert update delete drop truncate alter) 约束问题、数据类型、列属性 处理方法一: #临时停止同步 mysql> stop slave; #将同步指针向下移动一个(可重复操作) mysql> set global sql_slave_skip_counter=1; #开启同步 mysql> start slave; 处理方法二: #编辑配置文件 vim /etc/my.cnf #在[mysqld]标签下添加以下参数 slave-skip-errors=1032,1062,1007 但是以上操作都是有风险存在的 处理方法三: 1)重新备份数据库,恢复到从库 2)给从库设置为只读 #在命令行临时设置 mysql> set global read_only=1; #在配置文件中永久生效/etc/my.cnf read_only=1 6.延时从库 企业中一般会延时3-6小时 延时从库配置方法 从库操作 #停止主从 mysql>stop slave; #设置延时为180秒 mysql>change master to master_delay = 180; #开启主从 mysql>start slave; #查看状态 mysql> show slave status \G SQL_Delay: 60 3.延时从库停止方法 #停止主从 mysql> stop slave; #设置延时为0 mysql> CHANGE MASTER TO MASTER_DELAY = 0; #开启主从 mysql> start slave; 关闭半同步: 主库执行 SET GLOBAL rpl_semi_sync_master_enabled = 0; SET GLOBAL rpl_semi_sync_master_wait_no_slave = 0; 从库执行: SET GLOBAL rpl_semi_sync_slave_enabled = 0;
建议大家有资源的话尽量在两台机器上实验,一台机器上容易有坑。