Oracle11g静默安装

系统 IP 安装软件
centos7.8 192.168.100.101 Oracle11g
1.在/etc/hosts文件中添加主机名、关闭selinux、关闭防火墙
[root@centos ~]# vi /etc/hosts
192.168.100.101 centos  
[root@centos ~]# vi /etc/selinux/config
SELINUX=disabled
[root@centos ~]# systemctl stop firewalld
[root@centos ~]# systemctl disable firewalld
2.上传安装包

安装包可自行提取
链接:https://pan.baidu.com/s/1chTrmweSGNRE7-Z-PJm_Bg
提取码:01ig

[root@centos soft]# ls
p13390677_112040_Linux-x86-64_1of7.zip  p13390677_112040_Linux-x86-64_2of7.zip
3.解压Oracle安装包
[root@centos soft]# unzip p13390677_112040_Linux-x86-64_1of7.zip -d /tmp && unzip p13390677_112040_Linux-x86-64_2of7.zip -d /tmp
等待解压完成后,会在目录下生产一个database文件夹,里面有Oracle 11g安装文件

在这里插入图片描述

4.安装依赖包
[root@centos ~]# yum install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static ksh libaio libaio-devel numactl-devel sysstat unixODBC unixODBC-devel pcre-devel –y
5.添加用户和用户组
[root@centos ~]# groupadd oinstall
[root@centos ~]# groupadd dba
[root@centos ~]# useradd -g oinstall -G dba oracle
[root@centos ~]# passwd oracle  #这里密码设置为oracle
[root@centos ~]# id oracle
uid=1000(oracle) gid=1000(oinstall) 组=1000(oinstall),1001(dba)
6.修改内核参数配置文件
添加以下内容
[root@centos ~]# vi /etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

[root@centos ~]# sysctl -p

其中kernel.shmmax = 2147483648为本机物理内存的一半,单位为byte,我这里是4G内存
7.修改用户的限制文件
[root@centos ~]# vi /etc/security/limits.conf
添加以下内容
oracle           soft    nproc           2047
oracle           hard    nproc           16384
oracle           soft    nofile          1024
oracle           hard    nofile          65536
oracle           soft    stack           10240

修改/etc/pam.d/login文件
[root@centos ~]# vi /etc/pam.d/login
添加以下内容
session  required   /lib64/security/pam_limits.so
session  required   pam_limits.so

修改/etc/profile文件
[root@centos ~]# vi /etc/profile
添加以下内容
if [ $USER = "oracle" ]; then
 if [ $SHELL = "/bin/ksh" ]; then
     ulimit -p 16384
     ulimit -n 65536
 else
     ulimit -u 16384 -n 65536
  fi
fi
[root@centos ~]# source /etc/profile
8.创建安装目录和设置文件权限
[root@centos ~]# mkdir -p /u01/app/oracle/product/11.2.0
[root@centos ~]# mkdir /u01/app/oracle/oradata
[root@centos ~]# mkdir /u01/app/oracle/inventory
[root@centos ~]# mkdir /u01/app/oracle/fast_recovery_area
[root@centos ~]# chown -R oracle:oinstall /u01/app/oracle
[root@centos ~]# chmod -R 775 /u01/app/oracle
[root@centos ~]# dd if=/dev/zero of=/home/swapfile bs=1M count=512
[root@centos ~]# mkswap /home/swapfile
[root@centos ~]# swapon /home/swapfile
[root@centos ~]# vi /etc/fstab      #追加
/home/swapfile swap swap defaults 0 0
9.设置oracle用户环境变量
[root@centos ~]# su - oracle
[oracle@centos ~]$ vi .bash_profile
添加内容如下:
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0
ORACLE_SID=jcms     #其中实例名自建
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

[oracle@centos ~]$ source .bash_profile
10.编辑静默安装响应文件
[oracle@centos ~]$ cp -R /tmp/database/response/ .
[oracle@centos ~]$ cd response/
[oracle@centos response]$ vi db_install.rsp
29 oracle.install.option=INSTALL_DB_SWONLY
37 ORACLE_HOSTNAME=centos
42 UNIX_GROUP_NAME=oinstall
49 INVENTORY_LOCATION=/u01/app/oracle/inventory
86 SELECTED_LANGUAGES=en,zh_CN
91 ORACLE_HOME=/u01/app/oracle/product/11.2.0
96 ORACLE_BASE=/u01/app/oracle
107 oracle.install.db.InstallEdition=EE
154 oracle.install.db.DBA_GROUP=dba
160 oracle.install.db.OPER_GROUP=dba
400 DECLINE_SECURITY_UPDATES=true
11.根据响应文件静默安装Oracle 11g
[oracle@centos response]$ cd /tmp/database/
[oracle@centos database]$ ./runInstaller -silent -responseFile /home/oracle/response/db_install.rsp -ignorePrereq
执行开始会有一点时间没反应,稍等会就ok了,Oracle在后台静默安装。安装过程中,如果提示[WARNING]不必理会,此时安装程序仍在后台进行,如果出现[FATAL],则安装程序已经停止了。

可以在以下位置找到本次安装会话的日志:
/u01/app/oracle/inventory/logs/installActions…log
可以切换终端执行top命令查看后台进程一直是在安装的,/u01目录也在不断增大
在这里插入图片描述

按照要求新打开终端,以root身份登录,执行脚本:

[root@centos ~]# sh /u01/app/oracle/inventory/orainstRoot.sh
[root@centos ~]#  sh /u01/app/oracle/product/11.2.0/root.sh

在这里插入图片描述

12.以静默方式配置监听
[oracle@centos database]$ netca /silent /responsefile /home/oracle/response/netca.rsp

正在对命令行参数进行语法分析:
参数"silent" = true
参数"responsefile" = /home/oracle/response/netca.rsp
完成对命令行参数进行语法分析。
Oracle Net Services 配置:
完成概要文件配置。
Oracle Net 监听程序启动:
正在运行监听程序控制: 
  /u01/app/oracle/product/11.2.0/bin/lsnrctl start LISTENER
监听程序控制完成。
监听程序已成功启动。
监听程序配置完成。
成功完成 Oracle Net Services 配置。退出代码是0

成功运行后,在/u01/app/oracle/product/11.2.0/network/admin/中生成listener.ora和sqlnet.ora
通过netstat命令可以查看1521端口正在监听。
[oracle@centos database]$ netstat -tnulp | grep 1521
tcp        0      0 0.0.0.0:1521            0.0.0.0:*               LISTEN      4861/tnslsnr 
13.以静默方式建立新库,同时也建立一个对应的实例。
[oracle@centos database]$ vi /home/oracle/response/dbca.rsp
78 GDBNAME = "jcms"
170 SID = "jcms"
211 SYSPASSWORD = "oracle"
221 SYSTEMPASSWORD = "oracle"
252 SYSMANPASSWORD = "oracle"
262 DBSNMPPASSWORD = "oracle"
360 DATAFILEDESTINATION = /u01/app/oracle/oradata
370 RECOVERYAREADESTINATION=/u01/app/oracle/fast_recovery_area
418 CHARACTERSET = "ZHS16GBK"
553 TOTALMEMORY = "3276"

其中TOTALMEMORY = "3276" 为3276MB,物理内存4G*80%
14.进行静默配置
[oracle@centos database]$ dbca -silent -responseFile /home/oracle/response/dbca.rsp
复制数据库文件
1% 已完成
3% 已完成
11% 已完成
18% 已完成
37% 已完成
正在创建并启动 Oracle 实例
40% 已完成
45% 已完成
50% 已完成
55% 已完成
56% 已完成
60% 已完成
62% 已完成
正在进行数据库创建
66% 已完成
70% 已完成
73% 已完成
85% 已完成
96% 已完成
100% 已完成
有关详细信息, 请参阅日志文件 "/u01/app/oracle/cfgtoollogs/dbca/jcms/jcms.log"。

查看监听状态
[oracle@centos database]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 12:44:44

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                03-APR-2022 12:24:09
Uptime                    0 days 0 hr. 20 min. 35 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/centos/listener/alert/log.xml
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)   (KEY=EXTPROC1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos)(PORT=1521)))
Services Summary...
Service "jcms" has 1 instance(s).
 Instance "jcms", status READY, has 1 handler(s) for this service...
Service "jcmsXDB" has 1 instance(s).
 Instance "jcms", status READY, has 1 handler(s) for this service...
The command completed successfully

登录查看实例状态
[oracle@centos database]$  sqlplus / as sysdba
SQL> select status from v$instance;

STATUS
------------
OPEN
15.创建用户表空间,给予权限,用plsql工具连接
SQL> CREATE TABLESPACE test_data LOGGING DATAFILE '/u01/app/oracle/oradata/jcms/jcms01.dbf'  SIZE 32M  AUTOEXTEND ON  NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL;
Tablespace created.
SQL> CREATE USER jcms IDENTIFIED BY 12345678 DEFAULT TABLESPACE TEST_DATA ;

User created.
SQL> GRANT dba TO jcms;

Grant succeeded.

在这里插入图片描述
命令验证:
在这里插入图片描述

16.Oracle开机自启动设置
1.修改/u01/app/oracle/product/11.2.0/bin/dbstart
[oracle@centos ~]$ vi /u01/app/oracle/product/11.2.0/bin/dbstart
将ORACLE_HOME_LISTNER=$1修改为ORACLE_HOME_LISTNER=$ORACLE_HOME

2.修改/u01/app/oracle/product/11.2.0/bin/dbshut
[oracle@centos ~]$ vi /u01/app/oracle/product/11.2.0/bin/dbshut
将ORACLE_HOME_LISTNER=$1修改为ORACLE_HOME_LISTNER=$ORACLE_HOME

3.修改/etc/oratab文件
将jcms:/u01/app/oracle/product/11.2.0:N中最后的N改为Y,成为jcms:/u01/app/oracle/product/11.2.0:Y

4.输入命令dbshut和dbstart测试
[oracle@centos ~]$ dbshut
Processing Database instance "jcms": log file /u01/app/oracle/product/11.2.0/shutdown.log
[oracle@centos ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 14:53:34

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
 TNS-00511: No listener
 Linux Error: 2: No such file or directory
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)  (HOST=centos)(PORT=1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@centos ~]$ ps -ef |grep ora_ |grep -v grep
[oracle@centos ~]$
Oracle监听停止,进程消失

[oracle@centos ~]$ dbstart
Processing Database instance "jcms": log file /u01/app/oracle/product/11.2.0/startup.log
[oracle@centos ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 14:55:50

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                03-APR-2022 14:55:06
Uptime                    0 days 0 hr. 0 min. 43 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/centos/listener/alert/log.xml
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos)(PORT=1521)))
Services Summary...
Service "jcms" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
Service "jcmsXDB" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@centos ~]$ ps -ef |grep ora_ |grep -v grep 
oracle    24136      1  0 14:55 ?        00:00:00 ora_pmon_jcms
oracle    24140      1  0 14:55 ?        00:00:00 ora_psp0_jcms
oracle    24144      1  1 14:55 ?        00:00:00 ora_vktm_jcms
oracle    24150      1  0 14:55 ?        00:00:00 ora_gen0_jcms
oracle    24154      1  0 14:55 ?        00:00:00 ora_diag_jcms
oracle    24158      1  0 14:55 ?        00:00:00 ora_dbrm_jcms
oracle    24162      1  0 14:55 ?        00:00:00 ora_dia0_jcms
oracle    24166      1  0 14:55 ?        00:00:00 ora_mman_jcms
oracle    24170      1  0 14:55 ?        00:00:00 ora_dbw0_jcms
oracle    24174      1  0 14:55 ?        00:00:00 ora_lgwr_jcms
oracle    24178      1  0 14:55 ?        00:00:00 ora_ckpt_jcms
oracle    24182      1  0 14:55 ?        00:00:00 ora_smon_jcms
oracle    24186      1  0 14:55 ?        00:00:00 ora_reco_jcms
oracle    24190      1  0 14:55 ?        00:00:00 ora_mmon_jcms
oracle    24194      1  0 14:55 ?        00:00:00 ora_mmnl_jcms
oracle    24198      1  0 14:55 ?        00:00:00 ora_d000_jcms
oracle    24202      1  0 14:55 ?        00:00:00 ora_s000_jcms
oracle    24224      1  0 14:55 ?        00:00:00 ora_qmnc_jcms
oracle    24332      1  0 14:55 ?        00:00:00 ora_q000_jcms
oracle    24336      1  0 14:55 ?        00:00:00 ora_q001_jcms
oracle    24340      1  0 14:55 ?        00:00:00 ora_cjq0_jcms
Oracle监听启动,进程启动

5.切换到root账户建立自启动脚本
[root@centos ~]# vi /etc/rc.d/init.d/oracle
#!/bin/bash

# oracle: Start/Stop Oracle Database 11g R2
# chkconfig: 345 90 10
# description: The Oracle Database is an Object-Relational Database Management System.
#
 . /etc/rc.d/init.d/functions
LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0
ORACLE_USER=oracle
case "$1" in
'start')
 if [ -f $LOCKFILE ]; then
  echo $0 already running.
  exit 1
 fi
echo -n $"Starting Oracle Database:"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl start"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl start dbconsole"
touch $LOCKFILE
 ;;
'stop')
if [ ! -f $LOCKFILE ]; then
  echo $0 already stopping.
  exit 1
fi
echo -n $"Stopping Oracle Database:"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl stop"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl stop dbconsole"
rm -f $LOCKFILE
;;
'restart')
$0 stop
$0 start
;;
'status')
if [ -f $LOCKFILE ]; then
  echo $0 started.
  else
  echo $0 stopped.
fi
;;
*)
echo "Usage: $0 [start|stop|status]"
exit 1
esac
exit 0

[root@centos ~]# chmod 755 /etc/rc.d/init.d/oracle
[root@centos ~]# chkconfig oracle on
[root@centos ~]# chkconfig --list oracle
oracle          0:关 1:关 2:开 3:开 4:开 5:开 6:关

service oracle start/stop/restart测试
[root@centos ~]# service oracle stop
Stopping oracle (via systemctl):                           [  确定  ]
[root@centos ~]# service oracle status
/etc/init.d/oracle stopped.

reboot重启查看Oracle监听和实例进程均能自动启动

李泽信 发布于 2022-8-17 23:11

MySQL主从复制+MySQL读写分离

  • 环境
系统类型 IP 主机名 所需软件 硬件
centos7.8 192.168.100.105 master boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.106 slave boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.107 mycat jdk-8u171-linux-x64.tar.gz Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 内存:512M
centos7.8 192.168.100.108 lamp 内存:512M
[root@mycat ~]# tar xf jdk-8u171-linux-x64.tar.gz
[root@mycat ~]#  mv jdk1.8.0_171/ /usr/local/java
[root@mycat ~]#  vi /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@mycat ~]# source /etc/profile
[root@mycat ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# mv mycat/ /usr/local/
[root@mycat ~]# ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt
  • 在master节点进行授权允许mycat程序能够连接MySQL集群,slave节点会同步权限
[root@master ~]# mysql -uroot -p123123
mysql> grant all on *.* to 'linux'@'192.168.100.107' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
  • 配置mycat节点的代理服务并启动
[root@mycat ~]# vi /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="VIR" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" ></schema>

        <dataNode name="dn1" dataHost="node1" database="cloud" />

        <dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="192.168.100.105" url="192.168.100.105:3306" user="linux" password="123123">
                        <readHost host="192.168.100.106" url="192.168.100.106:3306" user="linux" password="123123" />
                </writeHost>
        </dataHost>
</mycat:schema>

[root@mycat ~]# vi /usr/local/mycat/conf/server.xml
     80         <user name="admin">                 ##管理员账户
     81                 <property name="password">admin</property>
     82                 <property name="schemas">VIR</property>
     95         <user name="user">                  ##普通用户,只读权限
     96                 <property name="password">user</property>
     97                 <property name="schemas">VIR</property>
     98                 <property name="readOnly">true</property>
     99         </user>

[root@mycat ~]# vi /usr/local/mycat/conf/log4j2.xml
     25         <asyncRoot level="debug" includeLocation="true">

[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -utpln |grep 8066
tcp        0      0 0.0.0.0:8066            0.0.0.0:*               LISTEN      13090/java
[root@mycat ~]# netstat -utpln |grep 9066
tcp        0      0 0.0.0.0:9066            0.0.0.0:*               LISTEN      13090/java
[root@mycat ~]# tail /usr/local/mycat/logs/wrapper.log              ##服务日志
[root@mycat ~]# tail /usr/local/mycat/logs/mycat.log                    ##读写分离日志
  • 在master节点创建测试数据库及表
[root@master ~]# mysql -uroot -p123123
mysql> create database cloud;
Query OK, 1 row affected (0.00 sec)
mysql> create table cloud.it (id int,name char(16));
Query OK, 0 rows affected (0.02 sec)
mysql> exit
  • lamp节点客户端测试数据读写分离
[root@lamp ~]# mysql -uadmin -padmin -h 192.168.100.107 -P 8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| VIR      |
+----------+
1 row in set (0.00 sec)

MySQL [(none)]> use VIR;
MySQL [VIR]> show tables;
+-----------------+
| Tables_in_cloud |
+-----------------+
| it              |
| it1             |
+-----------------+
2 rows in set (0.01 sec)

李泽信 发布于 2022-7-17 17:06

MySQL主从复制 源码安装

  • 安装环境
系统 IP 主机名 所需软件 硬件
centos7.8 192.168.100.105 master boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.106 slave boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
  • 在master主机上安装ntp时间服务
[root@master ~]# yum -y install ntp
[root@master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf
[root@master ~]# cat <<END >>/etc/ntp.conf 
 server 127.127.1.0
 fudge 127.127.1.0 stratum 8
 END
[root@master ~]# systemctl start ntpd
[root@master ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
  • 在slave主机中配置同步master的ntp时间
[root@slave ~]# yum -y install ntpdate
[root@slave ~]# ntpdate 192.168.100.105
[root@slave ~]# echo "/usr/sbin/ntpdate 192.168.100.105" >>/etc/rc.local
[root@slave ~]# chmod +x /etc/rc.local
  • 安装MySQL数据库,步骤相同,在此安装master
[root@master ~]# yum -y remove mysql-* boost-*      ##卸载系统中原有mysql与boost及依赖
[root@master ~]# rpm -qa mysql
[root@master ~]# rpm -qa boost
[root@master ~]# yum -y install gcc gcc-c++ ncurses bison libgcrypt perl cmake ncurses-devel
[root@master ~]# tar -zxvf boost_1_59_0.tar.gz
[root@master ~]# mv boost_1_59_0 /usr/local/boost/
[root@master ~]# groupadd mysql
[root@master ~]# useradd -r -g mysql mysql
[root@master ~]# tar zxvf mysql-5.7.12.tar.gz -C /usr/src/
[root@master ~]# cd /usr/src/mysql-5.7.12/          ##编译多次时,需要删除CMAKE的缓存,rm -rf /usr/src/mysql-5.7.12/CMakeCache.txt
[root@master mysql-5.7.12]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data \
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost -DSYSCONFDIR=/etc

注释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql                [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data                     [MySQL数据库文件存放目录]
-DDEFAULT_CHARSET=utf8                                 [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci                    [设置默认字符校对]
-DMYSQL_TCP_PORT=3306                                  [MySQL的监听端口]
-DMYSQL_USER=mysql                                     [MySQL用户名]    
-DWITH_MYISAM_STORAGE_ENGINE=1                         [安装MySQL的myisam数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1                       [安装MySQL的innodb数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1                        [安装MySQL的archive数据库引擎]
-DWITH_BLACKHOLE_STORAGE_ENGINE=1                      [安装MySQL的blackhole数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1                         [安装MySQL的memory数据库引擎]
-DENABLE_DOWNLOADS=1                                   [编译时允许自主下载相关文件]
-DDOWNLOAD_BOOST=1                                     [允许下载BOOST]
-DWITH_BOOST=/usr/local/boost                          [指定系统中存在的BOOST]

-DSYSCONFDIR=/etc                                      [MySQL配置文件所在目录]
-DWITH_READLINE=1                                      [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock            [MySQL的通讯目录]
-DENABLED_LOCAL_INFILE=1                               [启用加载本地数据]
-DWITH_PARTITION_STORAGE_ENGINE=1                       [启动mysql的分区存储结构]
-DEXTRA_CHARSETS=all                                   [使MySQL支持所有的扩展字符]
-DWITH_DEBUG=0                                         [禁用调试模式]
-DMYSQL_MAINTAINER_MODE=0 
-DWITH_SSL:STRING=bundled                              [通讯时支持ssl协议]
-DWITH_ZLIB:STRING=bundled                              [允许使用zlib library]
[root@master ~]# make -j `cat /proc/cpuinfo | grep processor| wc -l`
[root@master mysql-5.7.12]# make install
[root@master mysql-5.7.12]# chown -R mysql:mysql /usr/local/mysql
[root@master mysql-5.7.12]# cp /usr/src/mysql-5.7.12/support-files/my-default.cnf /etc/my.cnf
[root@master mysql-5.7.12]# cp /usr/src/mysql-5.7.12/support-files/mysql.server /etc/init.d/
[root@master mysql-5.7.12]# chmod +x /etc/init.d/mysql.server
[root@master mysql-5.7.12]# cat <<END >>/usr/lib/systemd/system/mysqld.service
 [Unit]
 Description=mysqldapi
 After=network.target

 [Service]
 Type=forking
 PIDFile=/usr/local/mysql/logs/mysqld.pid
 ExecStart=/etc/init.d/mysql.server start
 ExecReload=/etc/init.d/mysql.server restart
 ExecStop=/etc/init.d/mysql.server stop
 PrivateTmp=Flase

 [Install]
 WantedBy=multi-user.target
 END

注解:
PrivateTmp=Flase        ##此配置必须关闭,不然mysql连接文件mysql.sock文件会默认生成在以下位置/tmp/systemd-private-83bba738e8ff4837b5ae657eff983821-mysqld.service-BPxWpJ/tmp/mysql.sock,导致数据库无法连接,将此配置项关闭后,则文件正常生成在/tmp/mysql.sock
[root@master mysql-5.7.12]# echo "export PATH=$PATH:/usr/local/mysql/bin/" >>/etc/profile
[root@master mysql-5.7.12]# source /etc/profile
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data       初始化
注解:
--initialize-insecure               ##禁用mysql的密码策略(密码复杂性等),--initializeaize是开启密码策略,自动生成密码在mysqld.log文件中
--user=mysql                        ##运行的账户
--basedir=/usr/local/mysql          ##mysql的安装位置
--datadir=/usr/local/mysql/data     ##mysql数据库服务数据的物理存放路径

[root@master ~]# cat <<END >/etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character_set_server=utf8
init_connect='SET NAMES utf8'
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
skip-name-resolve
END

注解: 
[mysqld]                    ##声明区域
basedir = /usr/local/mysql          ##mysql的安装位置
datadir = /usr/local/mysql/data     ##mysql的物理文件存放位置
port = 3306                     ##mysql服务监听的端口
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES     ##mysql的模式
character_set_server=utf8           ##字符集
init_connect='SET NAMES utf8'       
log-error=/usr/local/mysql/logs/mysqld.log          ##指定日志文件位置
pid-file=/usr/local/mysql/logs/mysqld.pid           ##指定运行服务所产生的pid文件位置
skip-name-resolve                   ##禁用数据库的反向DNS解析

[root@master ~]# mkdir /usr/local/mysql/logs
[root@master ~]# chown mysql:mysql /usr/local/mysql/logs/
[root@master ~]# systemctl start mysqld
[root@master ~]#  systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@master ~]# netstat -utpln |grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      18723/mysqld
  • 优化配置master主机的mysql服务
[root@master ~]#  vi /etc/my.cnf        ##末尾添加
log-bin=master-bin
log-slave-updates
server-id=1
innodb_flush_log_at_trx_commit=2
master_info_repository=table
relay_log_info_repository=TABLE

注解:
log-bin=master-bin                          ##指定生成二进制文件,可加目录
log-slave-updates                           ##指定开启slave角色的更新
server-id=1                             ##指定id号码
innodb_flush_log_at_trx_commit=2            ##见下方
master_info_repository=table
relay_log_info_repository=TABLE

[root@master ~]#  systemctl restart mysqld
[root@master ~]#  ls /usr/local/mysql/data/
...  master-bin.000001  master-bin.index  ...
  • 优化配置slave主机的mysql
[root@slave ~]# vi /etc/my.cnf          ##末尾添加
log-bin=relay1-bin
relay-log=relay1-log-bin
relay-log-index=slave-relay1-bin.index
server-id=2
innodb_flush_log_at_trx_commit=2
slave-parallel-type=LOGICAL_CLOCK
slave_parallel_workers=16
master_info_repository=table
relay_log_info_repository=TABLE

注解:
relay-log=relay-log-bin                     ##中继日志文件名
relay-log-index=slave-relay-bin.index           ##中继日志索引文件
server-id=2                             ##id号码
innodb_flush_log_at_trx_commit=2
##指定数据库在存储数据时,事务的刷新方式,如下:
0:该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
1:最安全的,默认值,但是最慢是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
2:比0安全,速度比较快,是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
slave-parallel-type=LOGICAL_CLOCK
##选择并行复制的类型
slave_parallel_workers=16
##worker线程数量
master_info_repository=table
##默认是file,master的更新或者slave的更新直接存放在文件内,若出现故障,会出现数据丢失;若改为table,则为表的方式进行存储更新,支持事务,安全性更高;
relay_log_info_repository=TABLE
##指定中继日志更新,提升性能

[root@slave ~]# systemctl restart mysqld
[root@slave ~]# ls /usr/local/mysql/data/
...  relay1-bin.000001  relay1-bin.index ...
  • 配置master主机上的master角色,配置主节点
[root@master ~]# mysql -uroot -p123123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

mysql> grant replication slave on *.* to 'linuxfan'@'192.168.100.%' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>  show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      1008 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> create database linuxfan;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
  • 配置slave主机的slave角色,配置从节点
[root@slave ~]# mysql -uroot -p123123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.100.105',master_user='linuxfan',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1008;
mysql> start slave;

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.105
                  Master_User: linuxfan
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 1008
               Relay_Log_File: relay1-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  • 如果出现以下错误解决

错误1
slave中出现无法识别Master的UUID(虚拟机克隆导致mysql服务的UUID一致冲突);

解决方法:

[root@slave ~]# rm -rf /usr/local/mysql/data/auto.cnf           ##重新生成UUID的配置文件
[root@slave ~]# systemctl restart mysqld

错误2:slave中指定的master的position值大于当前值;

解决方法:

[root@slave ~]# mysql -uroot -p123123           ##重新指定master的position值
mysql> stop slave;
mysql> change master to ...
mysql> start slave;
  • 配置master角色指定主从复制中特定的数据库优化
[root@master ~]# vi /etc/my.cnf
binlog-do-db=linuxfan
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
expire_logs_days=7

注解:
binlog-do-db=linuxfan                   ##允许同步的数据库名称
binlog-ignore-db=mysql              ##不允许同步的数据库名称
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
expire_logs_days=7                      ##指定日志存放的时间为7天

[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use linuxfan;
Database changed
mysql> create table it(岗位 char(16),姓名 char(16),身份证号 char(48),学历 char(16),工资 int);
Query OK, 0 rows affected (0.02 sec)
mysql>  insert into it values('网络工程师','张三','150404199201091132','高 中','5500');
Query OK, 1 row affected (0.02 sec)
mysql> select * from it;
+-----------------+--------+--------------------+--------+--------+
| 岗位            | 姓名   | 身份证号           | 学历   | 工资   |
+-----------------+--------+--------------------+--------+--------+
| 网络工程师      | 张三   | 150404199201091132 | 高中   |   5500 |
+-----------------+--------+--------------------+--------+--------+
  • 验证slave角色的数据库复制情况
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> use linuxfan;
Database changed
mysql> select * from it;
+-----------------+--------+--------------------+--------+--------+
| 岗位            | 姓名   | 身份证号           | 学历   | 工资   |
+-----------------+--------+--------------------+--------+--------+
| 网络工程师      | 张三   | 150404199201091132 | 高中   |   5500 |
+-----------------+--------+--------------------+--------+--------+

错误:slave中无法找到当前insert语句所在的数据库,错误原因是在之前的同步中出现了失败,导致后续同步无法继续运行;

解决方案:在slave中创建缺少的数据库或者其他数据;

  • 查看并设置slave节点sql线程并发数量
mysql> show full processlist;
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 130 | root        | localhost | haha | Query   |    0 | starting                                               | show full processlist |
| 131 | system user |           | NULL | Connect | 5527 | Waiting for master to send event                       | NULL                  |
| 132 | system user |           | NULL | Connect |   55 | Slave has read all relay log; waiting for more updates | NULL                  |
| 133 | system user |           | NULL | Connect |   55 | Waiting for an event from Coordinator                  | NULL                  |
| 134 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 135 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 136 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 137 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 138 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 139 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 140 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 141 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 142 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 143 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 144 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 145 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 146 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 147 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 148 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
19 rows in set (0.00 sec)

mysql>  set @@global.slave_parallel_workers=2;
Query OK, 0 rows affected (0.00 sec)

mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave sql_thread;
Query OK, 0 rows affected (0.03 sec)

mysql> show full processlist;
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 130 | root        | localhost | haha | Query   |    0 | starting                                               | show full processlist |
| 131 | system user |           | NULL | Connect | 5565 | Waiting for master to send event                       | NULL                  |
| 149 | system user |           | NULL | Connect |    4 | Slave has read all relay log; waiting for more updates | NULL                  |
| 150 | system user |           | NULL | Connect |    4 | Waiting for an event from Coordinator                  | NULL                  |
| 151 | system user |           | NULL | Connect |    4 | Waiting for an event from Coordinator                  | NULL                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
5 rows in set (0.00 sec)

李泽信 发布于 2022-7-14 13:07

Centos7安装MySQL

Centos7安装MySQL

一、MySQL概述

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。 SQL是一种标准化的语言,它使得存储、更新和存取信息更容易;

MySQL存储原理

Mysql整体架构:

在这里插入图片描述

1.连接池:最上层负责和客户端进行连接,比如jdbc,odbj这样的数据库连接的API,在这一层有连接池的概念,类似于线程池,连接池可以同时处理很多个数据库请求。同时这一层有SSL的安全概念,可以确保连接是安全的;
2.SQL接口:当SQL语句进入MySQL后,会先到SQL接口中,这一层是封装层,将传过来的SQL语句拆散,将底层的结果封装成SQL的数据格式;
3.解析器:这一层负责将SQL语句进行拆分,验证,如果语句有问题那么就返回错误,如果没问题就继续向下执行;
4.优化器:对SQL查询的结果优化处理,产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。比如select a,b from c where d。在这里会先查询c表中符合d的数据并将他们的ab项进行投影,返回结果,并不会直接把整张表查出来;
5.缓存:对要查询的SQL语句进行hash后缓存,如果下一次是相同的查询语句,则在SQL接口之后直接返回结果;
6.存储引擎:MySQL有很多种存储引擎,每一种存储引擎有不同的特性,他们负责组织文件的存放形式,位置,访问文件的方法等等。比较常用的有innoDB,MyISAM,MAMORY等;
7.文件系统:真正存放物理文件的单位;

存储引擎:

在这里插入图片描述
1.MyISAM:是mysql 5.5版本之前的默认的存储引擎,它的前身是ISAM,MyISAM管理非事务表,提供告诉存储和检索,以及全文搜索能力,从而受到web开发者的喜爱;MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex);

优点:查询访问较快,因为读的时候会加表锁;
支持多种存储方式:静态表,动态表,压缩表等;
存储总行数;
通过key_buffer_size设置缓存索引,调高访问的性能,减少磁盘I/O的压力;

缺点:写入效率慢,因为写的时候会给整张表加锁;
没有事务的概念;
数据恢复起来比较困难;
数据写入过程中阻塞用户对表内数据的读取;
数据读取过程中阻塞用户对表内数据的写入;

生产环境场景
公司业务不需要事务的支持;
一般单方面的读取数据的需求较多,或者单方面写入数据的需求较多,不适合双方面;
服务器硬件资源相对比较差;

2.innoDB:支持事务,具有事务提交、回滚、崩溃恢复等机制,它的设计是为处理巨大数据量时的最大性能设置的,它的CPU效率是任何磁盘的关系数据库引擎所不能匹敌的,InnoDB存储引擎完全与Mysql服务器整合,为在内存中缓存数据和索引而维持它自己的缓冲池,InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上也无影响;InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件;

优点:支持事务,事务隔离级别;
支持外键,具有安全的约束性;
主键是唯一的聚集索引,和数据存放在一起,效率高;
可以有非聚集索引,非聚集索引单独存放,可以通过其查到聚集索引;
支持分区、表空间、类似于Oracle;

缺点:占用磁盘较多,占用内存较多(缓存);
读效率慢于MyISAM;
不存储总行数;

生产环境场景
业务需要事务的支持;
行级锁定对高并发有很好的适应能力;
业务数据更新较为频繁的场景,如微博,论坛等;
业务数据一致性要求较高,比如银行业务;
硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率;

总结

  1. 如果要提供读少写多,并且需要提交、回滚、崩溃恢复能力的事物安全能力,并要求实现并发控制,InnoDB是一个好的选择;
  2. 如果数据表主要用来读多写少,对原子性要求不高,则MyISAM引擎能提供较高的处理效率;
    如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果;
  3. 如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive;

    使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能,在数据库中可以使用命令show engines查看存储引擎;

二、MySQL安装,源码安装

安装环境
系统类型 IP地址 所需软件 硬件需求
Centos7.8 192.168.100.102 mysql-5.7.12.tar.gz、boost_1_59_0.tar.gz 内存:4G、CPU核心:2
查看并卸载系统所安装rpm
[root@localhost ~]# yum -y remove mysql-* boost-*
[root@localhost ~]# rpm -qa mysql
[root@localhost ~]# rpm -qa boost
安装依赖
[root@localhost ~]# yum -y install gcc gcc-c++ ncurses ncurses-devel bison libgcrypt perl cmake
注:MySQL5.5以上需要cmake进行编译
解压boost安装包
[root@localhost ~]# tar xf boost_1_59_0.tar.gz
[root@localhost ~]# mv boost_1_59_0 /usr/local/boost
创建mysql用户与组
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -r -g mysql mysql
安装MySQL安装包
[root@localhost ~]# tar xf mysql-5.7.12.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/mysql-5.7.12/           ##编译多次时,需要删除CMAKE的缓存,rm -rf /usr/src/mysql-5.7.12/CMakeCache.txt
[root@localhost mysql-5.7.12]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost -DSYSCONFDIR=/etc
[root@localhost mysql-5.7.12]# make -j `cat /proc/cpuinfo | grep processor| wc -l`
[root@localhost mysql-5.7.12]# make install
注释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql                [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data                     [MySQL数据库文件存放目录]
-DDEFAULT_CHARSET=utf8                                 [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci                    [设置默认字符校对]
-DMYSQL_TCP_PORT=3306                                  [MySQL的监听端口]
-DMYSQL_USER=mysql                                     [MySQL用户名]    
-DWITH_MYISAM_STORAGE_ENGINE=1                         [安装MySQL的myisam数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1                       [安装MySQL的innodb数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1                        [安装MySQL的archive数据库引擎]
-DWITH_BLACKHOLE_STORAGE_ENGINE=1                      [安装MySQL的blackhole数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1                         [安装MySQL的memory数据库引擎]
-DENABLE_DOWNLOADS=1                                   [编译时允许自主下载相关文件]
-DDOWNLOAD_BOOST=1                                     [允许下载BOOST]
-DWITH_BOOST=/usr/local/boost                          [指定系统中存在的BOOST]
-DSYSCONFDIR=/etc                                      [MySQL配置文件所在目录]
-DWITH_READLINE=1                                      [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock            [MySQL的通讯目录]
-DENABLED_LOCAL_INFILE=1                               [启用加载本地数据]
-DWITH_PARTITION_STORAGE_ENGINE=1                      [启动mysql的分区存储结构]
-DEXTRA_CHARSETS=all                                   [使MySQL支持所有的扩展字符]
-DWITH_DEBUG=0                                         [禁用调试模式]
-DMYSQL_MAINTAINER_MODE=0 
-DWITH_SSL:STRING=bundled                              [通讯时支持ssl协议]
-DWITH_ZLIB:STRING=bundled                             [允许使用zlib library]
优化调整Mysql程序
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql
[root@localhost ~]# cp /usr/src/mysql-5.7.12/support-files/my-default.cnf /etc/my.cnf
[root@localhost ~]# cp /usr/src/mysql-5.7.12/support-files/mysql.server /etc/init.d/
[root@localhost ~]# chmod +x /etc/init.d/mysql.server
[root@localhost ~]# cat <<END >>/usr/lib/systemd/system/mysqld.service  #编写服务控制脚本
[Unit]
Description=mysqldapi
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/mysql/logs/mysqld.pid
ExecStart=/etc/init.d/mysql.server start
ExecReload=/etc/init.d/mysql.server restart
ExecStop=/etc/init.d/mysql.server stop
PrivateTmp=Flase

[Install]
WantedBy=multi-user.target
END

注:
PrivateTmp=Flase        ##此配置必须关闭,不然mysql连接文件mysql.sock文件会默认生成在以下位置/tmp/systemd-private-83bba738e8ff4837b5ae657eff983821-mysqld.service-BPxWpJ/tmp/mysql.sock,导致数据库无法连接,将此配置项关闭后,则文件正常生成在/tmp/mysql.sock

[root@localhost ~]# echo "export PATH=$PATH:/usr/local/mysql/bin/" >>/etc/profile
[root@localhost ~]# source /etc/profile
初始化Mysql数据库服务
[root@localhost ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
注:
--initialize-insecure               ##禁用mysql的密码策略(密码复杂性等),--initializeaize是开启密码策略,自动生成密码在mysqld.log文件中
--user=mysql                        ##运行的账户
--basedir=/usr/local/mysql          ##mysql的安装位置
--datadir=/usr/local/mysql/data     ##mysql数据库服务数据的物理存放路径

[root@localhost ~]#cat <<END >/etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character_set_server=utf8
init_connect='SET NAMES utf8'
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
skip-name-resolve
END

注: 
[mysqld]                    ##声明区域
basedir = /usr/local/mysql          ##mysql的安装位置
datadir = /usr/local/mysql/data     ##mysql的物理文件存放位置
port = 3306                     ##mysql服务监听的端口
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES     ##mysql的模式
character_set_server=utf8           ##字符集
init_connect='SET NAMES utf8'       
log-error=/usr/local/mysql/logs/mysqld.log          ##指定日志文件位置
pid-file=/usr/local/mysql/logs/mysqld.pid           ##指定运行服务所产生的pid文件位置
skip-name-resolve                   ##跳过mysql的域名反向解析

[root@localhost ~]# mkdir /usr/local/mysql/logs
[root@localhost ~]# chown mysql:mysql /usr/local/mysql/logs/
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@localhost ~]# netstat -utpln |grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      30513/mysqld
测试连接访问数据库
[root@localhost ~]# mysql       ##登录mysql设置密码
mysql> alter user 'root'@'localhost' identified by '123123';
mysql> exit
[root@localhost ~]# mysql -uroot -p123123       #测试连接
mysql> exit

李泽信 发布于 2022-7-12 23:12

MySQL主从复制 yum安装

MySQL数据库的主从复制

  • 概述
    单台MySQL数据库服务器,需要承载客户端的读取和写入操作的请求,那么弱客户端请求过多,服务器会不堪重负,那么可以选择MySQL数据库集群的方式来增加MySQL服务处理数据的效率,想web集群一样,但是不得不考虑的是多台MySQL数据库之间数据的一致性;

  • MySQL主从复制原理

    • 在每一个失误更新之前,master在二进制日志记录这些改变,写入二进制日志完成后,master通知存储引擎提交事务

    • slave将master的Binary log复制到其中继日志中,首先slave开始一个I/O线程,I/O线程在master的Binary log中读取事件,如果已经跟上master,他会睡眠并等待master产生新的事件,I/O线程将这些事件写入到中继日志的Relay log中,中继日志通常存放在OS的缓存中,所以开销较小;

    • slave中的sql线程在中级日志Relay log中读取事件,并重放其中的时间而更新slave的数据,使其与master中的数据一致;

    • 复制类型

      • 基于语句的复制
        在主服务器上执行的sql语句,再从服务器上同样也会执行,MySQL默认选用基于语句的复制,效率比较高,MySQL5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见。master记录下改变数据的查询,然后slave从中继日志中读取事件,并执行它,这些sql语句与master执行的语句一样
      • 基于行的复制
        把改变的内容复制过去,而不是把命令重新执行一遍
        混合型的复制
        默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行
  • 主从复制方式

    • 基于二进制文件
      二级制日志文件
    • 基于GTID方式
      全局事务标示符自5.6版本开启的新型复制方式,GTID的组成:前面是server_uuid,后面是一个序列号
      例如:server_uuid:sequence number
      7800a22c-95ae-11e4-983d-080027de205a:10
      UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
      Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。

    工作过程

    1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
    2、slave端的I/O 线程将变更的binlog,写入到本地的relay log中。
    3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
    4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
    5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
    6、在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。
    优势:
    1、更简单的实现failover,不用以前那样在需要找二进制日志文件log_file和位置值log_pos。
    2、更简单的搭建主从复制。
    3、比传统的复制更加安全。
    4、GTID是连续的没有空洞的,保证数据的一致性,零丢失。     
    5、slave无需知道master的pos值和日志文件值,只需要知道master的ip、用户名、密码即可;
    
  • 搭建MySQL主从复制

系统环境 IP地址 安装版本
centos7.8 192.168.100.105 mysql5.7.39
centos7.8 192.168.100.106 mysql5.7.39
  • 安装MySQL,yum方式安装
    两台安装方式一致,详见https://www.studyxin.com/MySQL/61.html
  • 配置master主服务器
[root@localhost ~]# vim /etc/my.cnf         ##在mysqld区域添加以下内容
[mysqld]
server-id=1             ##配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin       ##打开mysql日志,日志格式为二进制
skip-name-resolve       ##关闭名称解析,(非必填)

[root@localhost ~]# systemctl restart  mysqld.service       ##重启生效
[root@localhost ~]# mysql -uroot -p123123
##在master的数据库中建立一个备份账户:使得每一个slave使用标准的MySQL用户名和密码连接master,进行赋值操作的用户会授予replication slave权限
mysql> grant replication slave,replication client on *.* to slave@'192.168.100.%' identified by '123123';

##在master的数据库执行show master status,查看主服务器二进制状态及位置号
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      622 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 配置slave从服务器
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2                     ##配置server-id,让从服务器有唯一ID号
relay-log=mysql-relay-bin       ##打开mysql日志,日志格式为二进制
read-only=1                     ##设置为只读权限
log-bin=mysql-bin               ##开启从服务器二进制日志
log-slave-updates=1             ##使得更新的数据写进二进制日志中

[root@localhost ~]# systemctl restart  mysqld.service
[root@localhost ~]# mysql -uroot -p123123
##让slave连接master,并开始重做master二进制日志中的事件
mysql> change master to master_host='192.168.100.105',
    -> master_user='slave',
    -> master_password='123123',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=622;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;         ##执行start  slave,启动复制线程
Query OK, 0 rows affected (0.00 sec)

##使用show slave status\G;查看服务器状态,如下所示,也可使用show processlist \G;查看当前复制状态
mysql> show slave status\G;
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

  • 测试主从同步
    在master服务器上创建数据库、表,并插入数据,查看slave同步状态
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> create database hello;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use hello;
mysql> create table good(id int not null);
mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| good            |
+-----------------+
1 row in set (0.00 sec)

mysql> insert into good values (1);
mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| good            |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from good;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

slave验证

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use hello;
mysql> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| good            |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from good;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

李泽信 发布于 2022-7-3 21:38

centos7 yum方式安装MySQL5.7

centos7 yum方式安装MySQL5.7

[root@localhost ~]# wget https://repo.mysql.com//mysql57-community-release-el7-10.noarch.rpm
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm

为避免出现 源 "MySQL 5.7 Community Server" 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确 的错误,应导入2022的密钥,见下行命令

[root@localhost ~]# rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
[root@localhost ~]# yum -y install mysql-community-server
[root@localhost ~]# systemctl start  mysqld.service
[root@localhost ~]# grep "password" /var/log/mysqld.log
2022-08-25T12:57:24.541900Z 1 [Note] A temporary password is generated for root@localhost: uHtloOduj0<I     ##此处为MySQL初始密码uHtloOduj0<I

[root@localhost ~]# mysql -uroot -p
Enter password:     ##此处输入uHtloOduj0<I登录MySQL
  • 修改密码规则
修改为简单密码规则配置,必须修改两个全局参数
1.修改validate_password_policy参数的值的值
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
2.配置判断密码的标准就基于密码的长度
validate_password_length参数默认为8,他有最小值的限制,最小值为4
mysql> set global validate_password_length=6;
Query OK, 0 rows affected (0.00 sec)
  • 查看MySQL密码配置规则
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

参数解释
validate_password_dictionary_file       ##插件用于验证密码强度的字典文件路径
validate_password_length            ##密码最小长度,参数默认为8,最小值的限制为4
validate_password_mixed_case_count      ##密码至少要包含的小写字母个数和大写字母个数
validate_password_number_count      ##密码至少要包含的数字个数
validate_password_policy        ##密码强度检查登记,0/LOW、1/MEDIUM、2/STRONG,默认是1
validate_password_special_char_count        ##密码至少要包含的特殊字符数
  • mysql修改密码
mysql> set password for 'root'@'localhost'=password('123123');
Query OK, 0 rows affected, 1 warning (0.00 sec)

李泽信 发布于 2022-7-2 21:03

个人资料

搜索

日历

时间进度

    今日剩余 59.6%
    本周剩余 37.1%
    本月剩余 22.0%
    本年剩余 52.2%

访问统计