MYSQL5.6.40源码安装 主从搭建 主主搭建
发布时间:2022-04-04 10:59:11 所属栏目:MySql教程 来源:互联网
导读:前面那篇5.6.38主从搭建的文章属于测试系统里面弄着玩的,以下这篇文章写的是在公司生产库上搭建的MYSQL主从。 在上系统前,纠结了很久,到底使用哪种数据库(PG?HBASE?MONGODB?)?最后选择了MYSQL是由于公司懂的人多,自己也比较熟悉,且新项目初期数
前面那篇5.6.38主从搭建的文章属于测试系统里面弄着玩的,以下这篇文章写的是在公司生产库上搭建的MYSQL主从。 在上系统前,纠结了很久,到底使用哪种数据库(PG?HBASE?MONGODB?)?最后选择了MYSQL是由于公司懂的人多,自己也比较熟悉,且新项目初期数据量不大,MYSQL可以满足需求,最最重要的是这个新项目属于探路性质的,如果真的被重视起来,那到时再把数据迁移出去就好了(基于开发说的数据结构简单单一,存储数据单一的情况,没有特别的数据类型等)。 所以最终选择了开源数据库中的一员MYSQL。(本来还有考虑ORACLE的,老本行,只不过考虑到领导们支持开源,那就用开源吧) 之前也纠结了要不要使用mysql5.7.22,结果去下载了安装,发现redhat6.5的cmake版本太低,不支持mysql5.7.22的编译,一下子又没找到redhat7的安装包,干脆就用mysql5.6.40这个5.6的最终稳定版算了。 操作系统,网卡,防火墙,IP地址配置等等在这里就不写了。 一、MYSQL源码安装 (两个节点都安装,步骤一样的) 安装环境: 操作系统REDHAT6.5 NODE1 主机名 master IP地址 192.168.159.148 NODE2 主机名 slave IP地址 192.168.159.149 1、安装依赖 yum -y install make gcc-c++ cmake bison-devel ncurses-devel perl 2、创建用户和组 groupadd mysql useradd mysql -g mysql -M -s /sbin/nologin 3、下载5.6.40源码包 https://downloads.mysql.com/archives/get/file/mysql-5.6.40.tar.gz 4、解压tar -zxvf mysql-5.6.40.tar.gz cd /opt/ tar -zxvf mysql-5.6.40.tar.gz cd mysql-5.6.40 5、编译安装 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc-DWITH_MYISAM_STORAGE_ENGINE=1-DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_MEMORY_STORAGE_ENGINE=1-DWITH_READLINE=1-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306-DENABLED_LOCAL_INFILE=1-DWITH_PARTITION_STORAGE_ENGINE=1-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci 说明: 设置安装目录 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 数据库存放目录 -DMYSQL_DATADIR=/usr/local/mysql/data 系统配置目录 -DSYSCONFDIR=/etc 安装 myisam 存储引擎 -DWITH_MYISAM_STORAGE_ENGINE=1 安装 innodb 存储引擎 -DWITH_INNOBASE_STORAGE_ENGINE=1 安装memory存储引擎 -DWITH_MEMORY_STORAGE_ENGINE=1 快捷键功能 -DWITH_READLINE=1 Unix socket文件路径 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock MySQL 监听端口 -DMYSQL_TCP_PORT=3306 允许从本地导入数据 -DENABLED_LOCAL_INFILE=1 安装数据库分区 -DWITH_PARTITION_STORAGE_ENGINE=1 安装所有扩展字符集 -DEXTRA_CHARSETS=all 使用 utf8 字符 -DDEFAULT_CHARSET=utf8 校验字符 -DDEFAULT_COLLATION=utf8_general_ci 支持 SSL -DWITH_SSL=yes make &&make install 6、目录授权 chown mysql.mysql /usr/local/mysql mkdir /usr/local/mysql/log chown mysql.mysql /usr/local/mysql/log 7、数据库初始化 cd /usr/local/mysql ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data 8、配置环境变量 vi /root/.bash_profile 在最后一行添加 PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/mysql/lib 二、MYSQL5.6.40主从搭建 1、Master端配置部署 a、在主服务器上的my.cnf配置文件中的[mysqld]节点下添加以下配置 vi /etc/my.cnf [mysqld] server-id=101 default-storage-engine=InnoDB lower_case_table_names=1 log-bin=/usr/local/mysql/log/mysql-bin.log log-bin-index=/usr/local/mysql/log/mysql-bin.index expire_logs_days=30 datadir=/usr/local/mysql/data socket=/tmp/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/usr/local/mysql/data/mysqld.log pid-file=/usr/local/mysql/mysqld.pid 说明: log-bin :给出二进制日志的所有文件基础名 log-bin-index :给出二进制日志文件的文件名,通常以000001开始,顺序递增。全名:master-bin.000001 server-id :mysql服务器唯一ID,在主从复制的所有服务器中必须唯一。 启动数据库 传统启动方式 /usr/local/mysql/bin/mysqld_safe --user=mysql & 制作成服务启动 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 查看启动是否成功 netstat -tnl|grep 3306 ps -ef|grep mysql 相关命令 service mysql start 停止mysql服务 service mysql stop 重启mysql服务 service mysql restart 添加到开机启动项 chkconfig --add mysql b、创建用户,并赋予权限: 登陆数据库时报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2) ln -s /tmp/mysql.sock /tmp/mysqld.sock 登陆 mysql -uroot create user repl_user; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '******'; 设置密码时会遇到报错: ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number 解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串 select password('123456'); 查出的是*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'; 2、Slave端配置部署 a、配置参数:[mysqld] vi /etc/my.cnf [mysqld] server-id=102 default-storage-engine=InnoDB lower_case_table_names=1 log-bin=/usr/local/mysql/log/mysql-bin.log log-bin-index=/usr/local/mysql/log/mysql-bin.index expire_logs_days=30 datadir=/usr/local/mysql/data socket=/tmp/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/usr/local/mysql/data/mysqld.log pid-file=/usr/local/mysql/mysqld.pid 3、建立主从同步 (重建备库也是使用该方法) 建立主从同步可以从主库上导出数据,也可以从已有的从库上导出数据,然后再导入到新的从库中,change master to建立同步。 (如果是新搭建主从,可以直接按照安装主库的方法直接安装从库就可以了,都是全新的,就不需要做下面的导出和导入操作) 3.1 、导出数据 在主库上导出数据: mysqldump -u***-p***-S /data/mysql6001/mysql.sock --default-character-set=utf8 –q --single-transaction --master-data-A > /tmp/all_database.sql (或者)在从库上导出数据: mysqldump -u***-p***-S /data/mysql6001/mysql.sock --default-character-set=utf8 -q --single-transaction --dump-slave-A > /tmp/all_database.sql NOTES: --master-data和--dump-slave导出的备份中,会包含master_log_file和master_log_pos信息。 例子: mysqldump -uroot --events --all-databases > /opt/mysql.dump 3.2、从库导入数据 mysql -u*** -p*** --default-character-set=utf8< all_database.sql 例子: mysql -uroot -p*** < /opt/mysql.dump 3.3、从库与主机建立同步 以下为建立主从同步最基本的6个项:change master to master_host='xxx.xxx.xxx.xxx', # 主库IP master_port=6001, # 主库mysqld的端口 master_user='repl', # 主库中创建的有REPLICATION SLAVE权限的用户 master_password='xxxxxxxx', # 该用户的密码 master_log_file='mysql-bin.000xxx', # 已在导入时指定了 master_log_pos=xxxxxx; #已在导入时指定了 start slave; 例子: master_log_file和master_log_pos通过在主库上使用命令获得: show master status G; 在从库上执行: change master to master_host='192.168.159.148', master_port=3306, master_user='repl_user', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=415; start slave; 验证主从是否搭建成功在从库执行 show slave status G 在主库创建一个表 use test create table aa (name char(10)); insert into aa values('Tom'); 在从库查询 use test select * from aa; 查到刚刚插入的数据就O了 修改root密码 cd /usr/local/ mysql /bin ./mysqladmin -u root password mysql> use mysql; mysql> desc user; mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; //授权远程连接 mysql> update user set Password = password('123456') where User='root'; //设置root用户密码 mysql> select Host,User,Password from user where User='root'; mysql> flush privileges; mysql> exit 二、MYSQL5.6.40主主搭建 前面的安装配置都一样,只需要配置/etc/my.cnf 1、主库A配置(192.168.159.148) vi /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock [mysqld] basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/data/mysql.pid log-error = /usr/local/mysql/data/mysql.err server-id = 1 auto_increment_offset = 1 auto_increment_increment = 2 #奇数ID log-bin = mysql-bin #打开二进制功能,MASTER主服务器必须打开此项 binlog-format=ROW #binlog-row-p_w_picpath=minimal #这个参数不知道为何会报错 log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M #binlog单文件最大值 replicate-ignore-db = mysql #忽略不同步主从的数据库 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake #忽略应用程序想要设置的其他字符集 init-connect='SET NAMES utf8' #连接时执行的SQL character-set-server=utf8 #服务端默认字符集 wait_timeout=1800 #请求的最大连接时间 interactive_timeout=1800 #和上一参数同时修改才会生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe] 2、主库B配置(192.168.159.149) vi /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock [mysqld] basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/data/mysql.pid log-error = /usr/local/mysql/data/mysql.err server-id = 2 auto_increment_offset = 2 auto_increment_increment = 2 #偶数ID log-bin = mysql-bin #打开二进制功能,MASTER主服务器必须打开此项 binlog-format=ROW #binlog-row-p_w_picpath=minimal #这个参数不知道为何会报错 log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #expire_logs_days=5 max_binlog_size=1024M #binlog单文件最大值 replicate-ignore-db = mysql #忽略不同步主从的数据库 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 skip-character-set-client-handshake #忽略应用程序想要设置的其他字符集 init-connect='SET NAMES utf8' #连接时执行的SQL character-set-server=utf8 #服务端默认字符集 wait_timeout=1800 #请求的最大连接时间 interactive_timeout=1800 #和上一参数同时修改才会生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe] 3、主库A(192.168.159.148)创建同步用户 mysql> grant replication slave on *.* to 'repl'@'192.168.159.149' identified by '123456'; mysql> flush privileges; 4、主库B(192.168.159.149) 创建同步用户 mysql> grant replication slave on *.* to 'repl'@'192.168.159.148' identified by '123456'; mysql> flush privileges; 5、 主库A(192.168.159.148 ) 配置同步信息 mysql> show master status; +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+ | mysql-bin.000003 | 2552 | | | 7b0fba4f-5cd4-11e8-bada-000c29ba59e8:1-20, a1788b59-5d6a-11e8-bead-000c295d547a:3-9 | +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> change master to master_host='192.168.159.149',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=1727; mysql > start slave; mysql> show slave status G; 注意看其中的这两个状态是YES就是正常 Slave_IO_Running: Yes Slave_SQL_Running: Yes 6、 主库A(192.168.159.149 ) 配置同步信息 mysql> show master status; +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+ | mysql-bin.000004 | 1727 | | | 7b0fba4f-5cd4-11e8-bada-000c29ba59e8:8-10:16-20, a1788b59-5d6a-11e8-bead-000c295d547a:1-9 | +------------------+----------+--------------+------------------+-------------------------------------------------------------------------------------------+ 1 row in set (0.05 sec) mysql> change master to master_host='192.168.159.148',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=2552; mysql > start slave; mysql > show slave status G; 注意看其中的这两个状态是YES就是正常 Slave_IO_Running: Yes Slave_SQL_Running: Yes 7、检测主主同步 可以在A库创建一个database 然后在B库看是否同步,再去B库创建一个database然后在A库看是否同步。 注意事项: mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。 --未完待续 8、MYSQL启动报错 (1) 报错现象: [root@node1 mysql]# service mysql start Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid). 查看报错日志: [root@node1 mysql]# tail /var/log/mysqld.log 190512 19:59:10 InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percents: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 InnoDB: Apply batch completed 190512 19:59:10 InnoDB: Waiting for the background threads to start 190512 19:59:11 InnoDB: 5.5.40 started; log sequence number 1595675 190512 19:59:11 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306 190512 19:59:11 [Note] - '0.0.0.0' resolves to '0.0.0.0'; 190512 19:59:11 [Note] Server socket created on IP: '0.0.0.0'. 190512 19:59:11 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist 190512 19:59:11 mysqld_safe mysqld from pid file /var/lib/mysql/node1.pid ended 解决方法: 查看配置文件,发现配置文件中datadir目录是默认的,需要修改成自己设置的/usr/local/mysql/data/ [root@node1 mysql]# cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [root@node1 mysql]# vi /etc/my.cnf datadir=/usr/local/mysql/data/ 修改完成后重新启动MYSQL成功 [root@node1 mysql]# service mysql start Starting MySQL.. SUCCESS! (2) 报错现象: [root@node1 mysql]# /usr/local/mysql/bin/mysql -uroot ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 查看配置文件发现socket文件在/var/lib/mysql/mysql.sock,而不是在 /tmp/mysql.sock [root@node1 mysql]# cat /etc/my.cnf [mysqld] datadir=/usr/local/mysql/data/ socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 解决方法: 设置软链接 ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 或者,修改配置文件 注意一个问题,在生产环境,要注意时区问题 vi /etc/my.cnf [mysqld] default-time_zone = '+8:00' 使用北京时间的时区 生产环境还要注意连接数的设置(操作系统也要设置) max_connections=3000 (编辑:大连站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐