MYSQL-主从配置

1、依赖安装
yum install -y cmake gcc gcc-c++ ncurses-devel
2、服务安装
#1、解压安装包
tar -xf mysql-5.7.16.tar.gz
tar -xf boost_1_59_0.tar.gz (支持json)
mkdir /usr/local/mysql
mv boost_1_59_0 /usr/local/mysql/boost
#2、创建目录和用户
groupadd mysql && useradd -g mysql mysql -s /bin/false
mkdir /data/mysql/data -p && chown mysql.mysql /data/mysql/data
mkdir /logs/mysql -p && chown mysql.mysql /logs/mysql/
mkdir /data/binlog/ && chown mysql.mysql /data/binlog/
#3、开始编译安装
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_BOOST=/usr/local/mysql/boost
make && make install
#4、初始化数据库
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld && chmod +x /etc/init.d/mysqld
#5、设置BIN环境
/etc/profile
PATH=$PATH:/usr/local/mysql/bin/:/usr/local/mysql/lib/
export PATH

3.修改主库配置文件

[client]
#password = your_password
default-character-set = utf8
port = 3306
socket = /usr/local/mysql/run/mysqld.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/run/mysqld.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 5M
table_open_cache = 512
#table_cache = 1024
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 300
query_cache_size = 32M
query_cache_limit= 4M
join_buffer_size = 8M
basedir = /usr/local/mysql
datadir = /data/mysql/data
pid-file = /usr/local/mysql/run/mysqld.pid
log-error = /logs/mysql/mysqld-error.log
slow_query_log
slow_query_log_file = /logs/mysql/mysql-slow-query.log
long_query_time = 1
wait_timeout = 28800
interactive_timeout = 28800
#table_cache = 614
max_connections = 5000
max_connect_errors = 6000
tmp_table_size = 256M
key_buffer_size = 2048M
bulk_insert_buffer_size = 64M
#myisam_sort_buffer_size = 128M
innodb_log_buffer_size = 16M
innodb_log_file_size = 512M
innodb_buffer_pool_size = 8192M
innodb_thread_concurrency = 8
innodb_log_files_in_group = 2
innodb_file_per_table = 1
long_query_time = 1
secure_file_priv = /tmp
#####主从配置项开始
#主库配置
bind-address = master_ip
log-bin = /data/binlog/mysql-binlog
log-bin = mysql-bin
binlog_format = mixed
server-id = 131
expire_logs_days = 10 #只保留7天的二进制日志,以防磁盘被日志占满
replicate-do-db = test #需要做复制的数据库名;这里不设置只配置备份的数据库
binlog-ignore-db = mysql #不备份的数据库
binlog-ignore-db = information_schema
binlog-ignore-db = performation_schema
binlog-ignore-db = sys
binlog-do-db=test #需要做复制的数据库名

4.从库配置

#从库配置
bind-address = slave_ip
#log-bin = /data/binlog/mysql-binlog
log-bin = mysql-bin
binlog_format = mixed
expire_logs_days = 10
server-id = 100
binlog-ignore-db = mysql #不备份的数据库
binlog-ignore-db = information_schema
binlog-ignore-db = performation_schema
binlog-ignore-db = sys
#replicate-do-db = db_name #需要同步的数据库
#replicate-ignore-db = mysql #不需要同步的库
#replicate-ignore-db = test #一般将mysql与test这两个库取消不要同步,保证业务使用的数据库即可

  [mysqldump]
  quick
  max_allowed_packet = 16M
  [mysql]
  no-auto-rehash
  [myisamchk]
  key_buffer_size = 256M
  sort_buffer_size = 256M
  read_buffer = 2M
  write_buffer = 2M
  [mysqlhotcopy]
  interactive-timeout

5、启动和验证服务
#1、启动从库
/etc/init.d/mysqld start
修改初始密码
SET PASSWORD = PASSWORD('123456');
#########主库相关操作
#2、配置主从
##1)修改my.cnf配置
##2)重启主库
/etc/init.d/mysqld restart
##3)创建同步用户
create user repl;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'Repuser2018';
##4)设置主库为只读(确保数据的一致性)
FLUSH TABLES WITH READ LOCK;
##5)查看主库状态(记录file和position的值)
SHOW MASTER STATUS;
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1024 | | | |

  ##6)导出主库数据
  单个库导出
  mysqldump -uroot -p --master-data --single-transaction -R --triggers -B youdb > youdb.sql
  全库导出
  mysqldump -uroot -p --master-data --single-transaction -R --triggers -A > all.sql
  ##7)数据导出完成后释放只读锁,让主库重新恢复写操作
  UNLOCK TABLES; 

  #########从库相关操作
  ##1)导入数据

  mysql -u root -p < all.sql 

  ##2)与主库建立连接,同步数据
  STOP SLAVE;
  change master to master_host='yourip',master_port=master_port,master_user='repl',master_password='Repuser2018',master_log_file='bin_file_name',master_log_pos=pos_value;
  START SLAVE;
  ##3)查看从库状态
  SHOW SLAVE STATUS \G;
  ############相关命令
  1、创建用户和授权
  CREATE USER 'youuser'@'%' IDENTIFIED BY '123456';
  grant select, insert, update, delete ON youdb.* TO youuser@'%' IDENTIFIED BY "123456";
  GRANT ALL ON yourdb.* to ddbshuser@'yourip' IDENTIFIED BY 'yourpass';
  flush privileges;

6.MySQL 复制的基本过程

# MySQL 复制的基本过程:
#1、Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
#2、Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
#3、Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
#4、Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。
# mysql bin log的设置
##MASTER:
master上只需要打开bin log;
设置binlog的复制模式为混合模式,即binlog_format=mixed;
不需要打开bin-relay。
##SLAVE:
不需要打开bin-log,因为SLAVE上的bin log都来源于MASTER的数据传入,如果打开,这里其实是给slave增加了IO负担;
上面的复制过程可以看到,我们slave上的IO进程获得到MASTER上的bin-log日志,然后记录到中继日志relay-bin中,然后slave上的SQL进程读取relay-bin的内容,并在slave上执行,达到复制的目的。
此处只要开启relay-bin就可以了。
如果有想使用SLAVE作为MASTER的备机,随时转换位置,作为MASTER使用的话,建议还是要再SLAVE上开启binlog

7.问题处理

#问题描述:
从库出现卡住
#解决办法:
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=900000; START SLAVE;

 

posted @ 2020-12-27 20:21  Buster_Hsueh  阅读(156)  评论(0编辑  收藏  举报