1 MySQL介绍
1.1 MySQL系列
1.1.1 MySQL 的三大主要分支
MySQL
Mariadb
Percona Server
1.1.2 官方网址
https://www.mysql.com/
http://mariadb.org/
https://www.percona.
1.1.3 官方文档
https://dev.mysql.com/doc/
https://mariadb.com/kb/en/
https://www.percona.com/software/mysql-database/percon
1.1.4 版本演变
MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0
MariaDB:5.1 -->5.5 -->10.0--> 10.1 --> 10.2 --> 10.3 --> 10.4 --> 10.5
MySQL的特性
开源免费
插件式存储引擎:也称为"表类型",存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎
MyISAM ==> Aria
InnoDB ==> XtraDB
单进程,多线程
诸多扩展和新特性
提供了较多测试组件
1.2 MySQL 安装方式介绍和快速安装
1.2.1 安装方式介绍
程序包管理器管理的程序包
源代码编译安装
二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
1.2.2 RPM包安装MySQL
CentOS 安装光盘
项目官方:https://downloads.mariadb.org/mariadb/repositories/
国内镜像:
https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/
CentOS 8:安装光盘直接提供
mysql-server:8.0
mariadb-server : 10.3
CentOS 7:安装光盘直接提供
mariadb-server:5.5 服务器包
mariadb 客户端工具包
CentOS 6:
mysql-server:5.1 服务器包
mysql 客户端工具包
范例: CentOS 7 利用yum源安装MySQL5.7
#创建mysql的repo文件
[root@centos7 ~]#tee /etc/yum.repos.d/mysql.repo < [mysql] name=mysql5.7 baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/ gpgcheck=0 EOF #安装mysql服务并设置启动并开启自启 [root@Centos7 ~]#yum install -y mysql-community-server [root@Centos7 ~]#systemctl enable --now mysqld #查看端口号3306 [root@Centos7 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 80 [::]:3306 [::]:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 100 [::1]:25 [::]:* #直接使用mysql工具登录提示拒绝 [root@Centos7 ~]#mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) #用户'root'@'localhost'的访问被拒绝(使用密码:NO) #过滤出mysql日志中的初始密码 [root@Centos7 ~]#grep password /var/log/mysqld.log 2023-08-02T09:12:19.484455Z 1 [Note] A temporary password is generated for root@localhost: hRs=qta-43h, 2023-08-02T09:12:30.626439Z 2 [Note] Access denied for user 'root'@'localhost' (using password: NO) #修改初始密码方法1 [root@Centos7 ~]#mysql -uroot -p'hRs=qta-43h,' mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.7.43 Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. #使用初始密码登录无法执行操作,需要修改密码后才可以,提示在执行此语句之前,必须使用ALTER USER语句重置密码。 mysql> status ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. #修改简单密码不符合密码策略,提示您的密码不符合当前策略要求 mysql> alter user root@'localhost' identified by 'dxj123'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements #修改为复杂密码修改成功 mysql> alter user root@'localhost' identified by 'Dxj123!@#'; Query OK, 0 rows affected (0.00 sec) #执行status查看状态信息 mysql> status -------------- mysql Ver 14.14 Distrib 5.7.43, for Linux (x86_64) using EditLine wrapper Connection id: 7 Current database: #当前所在的库 Current user: root@localhost #现在登录的用户 username@host host:指定可以通过哪个主机连接当前MySQL SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.43 #版本 Protocol version: 10 Connection: Localhost via UNIX socket #连接方式unix套接字(适用于同一台机器客户端服务端通讯) Server characterset: latin1 #数据库服务器字符集 Db characterset: latin1 #特定数据库所采用的字符集 Client characterset: utf8 #客户端应用程序连接到数据库时所使用的字符集。这决定了客户端发送给服务端以及从服务端接收到数据时需要进行哪种编码转换。 Conn. characterset: utf8 #连接级别的字符串表示当前与数据库建立连接所采用的客户端请求中包含的实际字符传输编码方式 UNIX socket: /var/lib/mysql/mysql.sock #套接字文件 Uptime: 8 min 48 sec Threads: 1 Questions: 13 Slow queries: 0 Opens: 107 Flush tables: 1 Open tables: 100 Queries per secnd avg: 0.024 -------------- #修改初始密码方法2 [root@Centos7 ~]#mysqladmin -uroot -p'hRs=qta-43h,' password 'Dxj123!@#' mysqladmin: [Warning] Using a password on the command line interface can be insecure. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. 1.2.3 通用二进制安装安装MySQL 5.7 和 MySQL8.0 1.2.3.1 安装相关包 #安装依赖包 yum -y install libaio numactl-libs 1.2.3.2 用户和组 #创建mysql用户组 groupadd mysql #创建mysql用户 -r:系统用户 -g:指定所属组mysql -s:/bin/false禁止用户登录 useradd -r -g mysql -s /bin/false mysql 1.2.3.3 准备程序文件 #二进制包默认编译时指定的路径为/usr/local/mysql,所以需要解压到该路径并创建软连接 wget http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local cd /usr/local/ ln -s mysql-5.7.31-linux-glibc2.12-x86_64/ mysql chown -R root.root /usr/local/mysql 1.2.3.4 准备环境变量 echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh 1.2.3.5 准备配置文件 cp /etc/my.cnf{,.bak} vim /etc/my.cnf [mysqld] datadir=/data/mysql #数据库数据存放目录 skip_name_resolve=1 #服务器MySQL将不做dns反向解析,不将ip地址解析成主机名(启用反向解析dns可能解析不了,会影响连接速度)。 socket=/data/mysql/mysql.sock #指定服务端socket文件位置 log-error=/data/mysql/mysql.log ##指定日志文件位置 pid-file=/data/mysql/mysql.pid #指定pid文件位置 [client] socket=/data/mysql/mysql.sock #指定客户端socket文件位置 1.2.3.6 初始化数据库文件并提取root密码 #/data/mysql 会自动生成,但是/data/必须事先存在 mkdir -pv /data/mysql 1.2.3.6.1 方式1: 生成随机密码 #mysql初始化 mysqld --initialize --user=mysql --datadir=/data/mysql ...省略... 2019-07-04T13:03:54.258140Z 1 [Note] A temporary password is generated forroot@localhost: LufavlMka6,! #注意生成root的初始密码 grep password /data/mysql/mysql.log 2019-12-26T13:31:30.458826Z 1 [Note] A temporary password is generated forroot@localhost: LufavlMka6,! awk '/temporary password/{print $NF}' /data/mysql/mysql.log LufavlMka6,! 1.2.3.6.2 方式2: 生成 root 空密码 mysqld --initialize-insecure --user=mysql --datadir=/data/mysql 1.2.3.7 准备服务脚本和启动 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start 1.2.3.8 修改口令 #修改前面生成的随机密码为指定密码 mysqladmin -uroot -p'LufavlMka6,!' password 123456 #修改前面生成的空密码为指定密码 mysqladmin -uroot password 123456 1.2.3.9 测试登录 mysql -uroot -p123456 1.2.4 一键安装MySQL5.7 和 MySQL8.0 二进制包的脚本 1.2.4.1 离线安装脚本 #!/bin/bash . /etc/init.d/functions SRC_DIR=`pwd` #MYSQL='mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz' MYSQL='mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz' COLOR='echo -e \E[01;31m' END='\E[0m' MYSQL_ROOT_PASSWORD=123456 check (){ if [ $UID -ne 0 ]; then action "当前用户不是root,安装失败" false exit 1 fi cd $SRC_DIR if [ ! -e $MYSQL ];then $COLOR"缺少${MYSQL}文件"$END $COLOR"请将相关软件放在${SRC_DIR}目录下"$END exit elif [ -e /usr/local/mysql ];then action "数据库已存在,安装失败" false exit else return fi } install_mysql(){ $COLOR"开始安装MySQL数据库..."$END yum -y -q install libaio numactl-libs cd $SRC_DIR tar xf $MYSQL -C /usr/local/ MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'` ln -s /usr/local/$MYSQL_DIR /usr/local/mysql chown -R root.root /usr/local/mysql/ id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; } echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh ln -s /usr/local/mysql/bin/* /usr/bin/ cat > /etc/my.cnf <<-EOF [mysqld] server-id=1 log-bin datadir=/data/mysql socket=/data/mysql/mysql.sock log-error=/data/mysql/mysql.log pid-file=/data/mysql/mysql.pid [client] socket=/data/mysql/mysql.sock EOF [ -d /data ] || mkdir /data mysqld --initialize --user=mysql --datadir=/data/mysql cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on service mysqld start [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; } sleep 3 MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log` mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null action "数据库安装完成" } check install_mysql 1.2.4.2 在线安装脚本 [root@centos7 ~]#cat install_online_mysql5.7or8.0_for_centos.sh #!/bin/bash . /etc/init.d/functions SRC_DIR=`pwd` MYSQL='mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz' URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.7 #MYSQL='mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz' #URL=http://mirrors.163.com/mysql/Downloads/MySQL-8.0 COLOR='echo -e \E[01;31m END='\E[0m' MYSQL_ROOT_PASSWORD=123456 check (){ if [ $UID -ne 0 ]; then action "当前用户不是root,安装失败" false exit 1 fi cd $SRC_DIR rpm -q wget || yum -y -q install wget wget $URL/$MYSQL if [ ! -e $MYSQL ];then $COLOR"缺少${MYSQL}文件"$END $COLOR"请将相关软件放在${SRC_DIR}目录下"$END exit elif [ -e /usr/local/mysql ];then action "数据库已存在,安装失败" false exit else return fi } install_mysql(){ $COLOR"开始安装MySQL数据库..."$END yum -y -q install libaio numactl-libs cd $SRC_DIR tar xf $MYSQL -C /usr/local/ MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'` ln -s /usr/local/$MYSQL_DIR /usr/local/mysql chown -R root.root /usr/local/mysql/ id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ; action "创建mysql用户"; } echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh ln -s /usr/local/mysql/bin/* /usr/bin/ cat > /etc/my.cnf <<-EOF [mysqld] server-id=`hostname -I|cut -d. -f4` log-bin datadir=/data/mysql socket=/data/mysql/mysql.sock log-error=/data/mysql/mysql.log pid-file=/data/mysql/mysql.pid [client] socket=/data/mysql/mysql.sock EOF [ -d /data ] || mkdir /data mysqld --initialize --user=mysql --datadir=/data/mysql cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on service mysqld start [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; } sleep 3 MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log` mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null action "数据库安装完成" } check install_mysql 1.2.5 源码编译安装 MySQL 建议:内存6G以上,否则可能会编译出错,CPU 核数越多越好 说明:本操作过程适用于以下版本 mysql-5.6.51.tar.gz mariadb-10.2.18.tar.gz CentOS 7 1.2.5.1 安装相关依赖包 yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dump 1.2.5.2 做准备用户和数据目录 useradd -r -s /sbin/nologin -d /data/mysql mysql 1.2.5.3 准备数据库目录 mkdir -p /data/mysql chown mysql.mysql /data/mysql 1.2.5.4 源码编译安装 编译安装说明 利用cmake编译,而利用传统方法,cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译 1.2.5.4.1 下载并解压缩源码包 tar xvf mysql-5.6.51.tar.gz -C /usr/local/src #mariadb-10.2.18.tar.gz 1.2.5.4.2 源码编译安装 MySQL #mysql-5.6.51编译安装 cd mysql-5.6.51/ cmake . \ -DCMAKE_INSTALL_PREFIX=/apps/mysql \ -DMYSQL_DATADIR=/data/mysql/ \ -DSYSCONFDIR=/etc/ \ -DMYSQL_USER=mysql \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITHOUT_MROONGA_STORAGE_ENGINE=1 \ -DWITH_DEBUG=0 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci make -j 8 && make install 提示:如果出错,执行rm -f CMakeCache.txt 范例:mysql8.0.34编译安装 #安装依赖包 yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dump gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc libtirpc-devel rpcgen #下载boost库文件 wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.bz2 tar xf boost_1_77_0.tar.bz2 -C /usr/local/src/mysql-8.0.34 cd /usr/local/src/mysql-8.0.34/ mkdir bld cd bld #运行cmake ..命令时,它会告诉CMake在当前目录的上一级目录中找到名为CMakeLists.txt的文件,并根据该文件进行配置并生成构建文件。这通常被称为“out- of-source”或“out-of-tree”构建方式,意味着构建过程将发生在与源代码分离的目录中。 cmake .. \ -DCMAKE_INSTALL_PREFIX=/apps/mysql \ -DMYSQL_DATADIR=/data/mysql/ \ -DSYSCONFDIR=/etc/ \ -DMYSQL_USER=mysql \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITHOUT_MROONGA_STORAGE_ENGINE=1 \ -DWITH_DEBUG=0 -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=bundled \ -DWITH_LIBWRAP=0 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_BOOST=/usr/local/src/mysql-8.0.34/boost_1_77_0/ make -j 8 && make install 1.2.5.5 准备环境变量 echo 'PATH=/apps/mysql/bin:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh 1.2.5.6 生成数据库文件 cd /apps/mysql/ scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql #8.0版本初始化 bin/mysqld --initialize --user=mysql --datadir=/data/mysql/ 1.2.5.7 准备配置文件 cp -b /apps/mysql/support-files/my-default.cnf /etc/my.cnf #针对旧版本或mariadb-10.2.18.tar.gz cp /apps/mysql/support-files/my-huge.cnf /etc/my.cnf 1.2.5.8 准备启动脚本,并启动服务+ cp /apps/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start 1.2.5.9安全初始化 mysql_secure_installation 1.2.6 基于 docker 容器创建 MySQL [root@ubuntu1804 ~]#docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30 [root@ubuntu1804 ~]#mysql -uroot -p123456 -h127.0.0.1 1.3 MySQL 组成和常用工具 1.3.1 客户端程序 mysql: 基于mysql协议交互式或非交互式的CLI工具 mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中 mysqladmin:基于mysql协议管理mysqld mysqlimport:数据导入工具 MyISAM存储引擎的管理工具: myisamchk:检查MyISAM库 myisampack:打包MyISAM表,只读 1.3.2 服务器端程序 mysqld_safe mysqld mysqld_multi 多实例 ,示例:mysqld_multi --example 1.3.3 用户账号 mysql用户账号由两部分组成: 'USERNAME'@'HOST' wordpress@'10.0.0.100' wordpress@'10.0.0.%' wordpress@'% 说明: HOST限制此用户可通过哪些远程主机连接mysql服务器 支持使用通配符: % 匹配任意长度的任意字符,相当于shell中*, 示例: 172.16.0.0/255.255.0.0 或 172.16.%.% _ 匹配任意单个字符,相当于shell中? 1.3.4 mysql 客户端命令 1.3.4.1 mysql 运行命令类型 客户端命令:本地执行,每个命令都完整形式和简写格式 范例: 查看版本 [root@centos8 ~]#mysql -V mysql Ver 8.0.21 for Linux on x86_64 (Source distribution) 范例: mysql> \h, help #查看帮助 mysql> \u,use #使用数据库(进到指定数据库) mysql> \s,status #从服务器获取状态信息 mysql> \!,system #执行shell命令 服务端命令:通过mysql协议发往服务器执行并取回结果,命令末尾都必须使用命令结束符号,默认为分号 #示例: mysql>SELECT VERSION(); 1.3.4.2 mysql 使用模式 交互模式 脚本模式: mysql -uUSERNAME -pPASSWORD < /path/somefile.sql cat /path/somefile.sql | mysql -uUSERNAME -pPASSWORD mysql>source /path/from/somefile.sql #source引用sql文件 1.3.4.3 mysql命令使用格式 mysql [OPTIONS] [database] 通过mysql --help获取帮助 mysql客户端常用选项: -A, --no-auto-rehash 禁止补全 -u, --user= 用户名,默认为root -h, --host= 服务器主机,默认为localhost -p, --passowrd= 用户密码,建议使用-p,默认为空密码 -P, --port= 服务器端口 -S, --socket= 指定连接socket文件路径 -D, --database= 指定默认数据库 -C, --compress 启用压缩 -e "SQL" 执行SQL命令 -V, --version 显示版本 -v --verbose 显示详细信息 --print-defaults 获取程序默认使用的配置 登录系统: #默认空密码登录 mysql -uroot -p 范例: 运行mysql命令 mysql>use mysql #切换数据库 mysql> select database(); #查看当前数据库 mysql>select user(); #查看当前用户 mysql>SELECT User,Host,Password FROM user; mysql>system clear #清屏 mysql> ^DBye #ctrl+d 退出 范例:客户端 mysql 的配置文件,修改提示符 #查看mysql版本 [root@centos8 ~]#mysql -V mysql Ver 15.1 Distrib 10.3.11-MariaDB, for Linux (x86_64) using readline 5.1 #可通过man mysql命令通过prompt查看选项说明 #临时修改mysql提示符,\\r:\\m:\\s 小时分钟秒 (\\u@\\h)用户@主机 [\\d]数据库名 [root@centos8 ~]#mysql -uroot -p123456 --prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_" #临时修改mysql提示符 [root@centos8 ~]#export MYSQL_PS1="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_" #持久修改mysql提示符 [root@centos8 ~]#vim /etc/my.cnf.d/mysql-clients.cnf [mysql] prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_" #12小进制 prompt="\\R:\\m:\\s(\\u@\\h) [\\d]>\\_" #24小进制 #查看MySQL服务器当前实际使用的各种配置参数 [root@centos8 ~]#mysql --print-defaults -v mysql would have been started with the following arguments: --prompt=\r:\m:\s(\u@\h) [\d]>\_ -v #查看提示符 [root@centos8 ~]#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 11 Server version: 10.3.11-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 10:29:30(root@localhost) [(none)]> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed 10:29:34(root@localhost) [mysql]> exit 范例:配置所有MySQL 客户端的自动登录 vim /etc/my.cnf.d/client.cnf [client] user=root password=123456 [mysql] prompt=(\\u@\\h) [\\d]>\\_ 1.3.4.4 mysqladmin命令 mysqladmin 命令格式 mysqladmin [OPTIONS] command command.. 通过mysqladmin --help获取帮助 范例: #查看mysql服务是否正常,如果正常提示mysqld is alive mysqladmin -uroot -pcentos ping #关闭mysql服务,但mysqladmin命令无法开启 mysqladmin -uroot -p123456 shutdown #创建数据库testdb mysqladmin -uroot -p123456 create testdb #删除数据库testdb mysqladmin -uroot -p123456 drop testdb #修改root密码 mysqladmin -uroot -p123456 password 'centos' #日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N mysqladmin -uroot -p123456 flush-log 1.3.5 服务器端配置 1.3.5.1 服务器端配置文件 服务器端(mysqld):工作特性有多种配置方式 1、命令行选项: 2、配置文件:类ini格式,集中式的配置,能够为mysql的各应用程序提供配置信息 服务器端配置文件: /etc/my.cnf #Global选项 /etc/mysql/my.cnf #Global选项 ~/.my.cnf #User-specific选项,针对特定用户的 配置文件格式: [mysqld] #用于设置MySQL服务器(即监控进程)的参数。在该节中,可以定义与服务器相关的选项,如端口号、数据目录等 [mysqld_safe] #该配置包含了mysqld_safe工具的参数。mysqld_safe是一个启动和停止MySQL服务时使用的脚本工具,它负责处理错误检测和自动重启等任务。 [mysqld_multi] #该配置节用于多实例管理器mysqld_multi的参数设置。通过mysqld_multi可以同时管理多个独立运行的MySQL实例。 [mysql] #针对mysql客户端(mysql指定)此部分用于客户端程序(例如命令行工具)连接到MySQL服务器时使用的默认选项。您可以在此处定义一些客户端相关的设置,例如默认字符集、用户名等。 [mysqladmin] #这是关于mysqladmin命令行工具使用时所需选项和设置信息的部分。mysqladmin用于执行各种管理任务,如用户创建、备份数据库等。 [mysqldump] #该部分指定 mysqdump 命令行工具的默认选项和配置信息。mysqldump 用于备份 MySQL 数据库。 [server] #此部分包含了关于服务器方面的一些通用设置,如字符集、错误日志路径等。 [client] #针对所有MySQL客户端,本节定义了客户端程序(例如命令行工具)的一些默认选项,如连接超时时间、输出格式等。 格式: parameter = value 说明: _和- 相同 1,ON,TRUE意义相同, 0,OFF,FALSE意义相同,无区分大小写 1.3.5.2 socket 连接说明 官方说明 https://dev.mysql.com/doc/mysql-port-reference/en/mysql-ports-reference-tables.html#mysql-client-server-ports 服务器监听的两种 socket 地址: ip socket: 监听在tcp的3306端口,支持远程通信 ,侦听3306/tcp端口可以在绑定有一个或全部接口IP上 unix sock: 监听在sock文件上,仅支持本机通信, 如:/var/lib/mysql/mysql.sock) 说明:host为localhost 时自动使用unix sock 范例: 查看MySQL的端口 mysql> SHOW VARIABLES LIKE 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+ 1 row in set (0.01 sec) #MySQL8.0增加了一个33060/tcp端口 #Port 33060 is the default port for the MySQL Database Extended Interface (the MySQL X Protocol). mysql> SHOW VARIABLES LIKE 'mysqlx_port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | mysqlx_port | 33060 | +---------------+-------+ 1 row in set (0.00 sec) 1.3.5.3 关闭mysqld网络连接 只侦听本地客户端, 所有客户端和服务器的交互都通过一个socket文件实现,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改 范例: vim /etc/my.cnf [mysqld] skip-networking=1 #禁用网络连接.只能通过本地主机(即localhost)访问MySQL服务,而无法从其他计算机或网络中进行远程连接。该选项适用于那些不需要远程访问数据库的情况下,可以提高安全性并减少潜在的风险。 bind_address=127.0.0.1 #指定mysql服务器绑定监听的IP地址。默认情况下,它设置为0.0.0.0,表示服务器将监听所有可用的网络接口,并且允许来自任何IP地址的连接。如果将其设置为127.0.0.1或特定指定IP地址,则表示仅允许通过本地回环接口进行连接,否则只能在本地主机上进行访问。这样可以增加安全性并限制对数据库的直接外部访问。 1.4 MySQL多实例 1.4.1 多实例介绍和方案 1.4.1.1 多实例介绍 什么是数据库多实例 多实例类似微信双开,端口号类比微信账号,数据库类比聊天窗口,表类比聊天记录 MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307等),同时运行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。 多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现 多实例的好处 可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要用到主从复制等技术,多实例就是最佳选择 多实例弊端 存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以具体的需求要根据自己的实际情况而定。 1.4.1.2 MySQL多实例常见的配置方案 单一的配置文件、单一启动程序多实例部署方式 MySQL官方文档提到的单一配置文件、单一启动程序多实例部署方式 耦合度太高,一个配置文件不好管理。不是很推荐。 多配置文件、多启动程序部署方式 多配置文件、多启动程序部署方式是针对每个实例都有独立的配置文件和目录,管理灵活,此方案耦合度较低 工作开发和运维的统一原则:降低耦合度。所以建议的此方式 1.4.2 实战案例 :Rocky 8 实现mariadb的yum安装的多实例 1.4.2.1 实战目的 Rocky 8 yum安装mariadb-10.3.17并实现三个实例 1.4.2.2 环境要求 一台系统Rocky 8.X主机 1.4.2.3 前提准备 关闭SElinux 关闭防火墙 时间同步 1.4.2.4 实现步骤 1.4.2.4.1 安装mariadb [root@centos8 ~]#yum -y install mariadb-server 1.4.2.4.2 准备三个实例的目录 [root@centos8 ~]#mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid} [root@centos8 ~]#chown -R mysql.mysql /mysql [root@centos8 ~]#tree -d /mysql/ #-d只列出目录 /mysql/ ├── 3306 │ ├── bin │ ├── data │ ├── etc │ ├── log │ ├── pid │ └── socket ├── 3307 │ ├── bin │ ├── data │ ├── etc │ ├── log │ ├── pid │ └── socket └── 3308 ├── bin ├── data ├── etc ├── log ├── pid └── socket 21 directorie 1.4.2.4.3 生成数据库文件 #初始化 [root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3306/data [root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3307/data [root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3308/data #可通过循环执行上述命令 [root@centos8 ~]for port in {3306..3308};do mysql_install_db --user=mysql --datadir=/mysql/$port/data ;done 1.4.2.4.4 准备配置文件 [root@centos8 ~]#vim /mysql/3306/etc/my.cnf [mysqld] port=3306 datadir=/mysql/3306/data socket=/mysql/3306/socket/mysql.sock log-error=/mysql/3306/log/mysql.log pid-file=/mysql/3306/pid/mysql.pid #重复上面步骤设置3307,3308 [root@centos8 ~]#sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf [root@centos8 ~]#sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf 1.4.2.4.5 准备启动脚本 [root@centos8 ~]#vim /mysql/3306/bin/mysqld #!/bin/bash port=3306 #该实例所用端口 mysql_user="root" #mysql连接时所用用户名 mysql_pwd="123456" #mysql连接时所用密码 cmd_path="/usr/bin" #存放可执行文件所在路径(例如mysqld_safe和mysqladmin) mysql_basedir="/mysql" #MySQL安装目录根路径 mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock" #MySQL数据库socket文件所在位置 #定义mysql启动函数,mysqld_safe启动数据库服务,--defaults-file使用指定的配置文件加载相应的设置 function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null & else printf "MySQL is running...\n" exit fi } #定义mysql关闭函数 function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown fi } #定义mysql重启函数 function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } # 使用case语句来根据输入参数$1执行不同的操作 case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n" esac #重复上述过程,分别建立3307,3308的启动脚本 #启动脚本添加执行权限 [root@centos8 ~]#chmod +x /mysql/3306/bin/mysqld [root@centos8 ~]#chmod +x /mysql/3307/bin/mysqld [root@centos8 ~]#chmod +x /mysql/3308/bin/mysqld #可通过循环替代上述命令 [root@centos8 ~]#for port in {3306..3308};do chmod +x /mysql/$port/bin/mysqld ;done 1.4.2.4.6 启动服务 [root@centos8 ~]#/mysql/3306/bin/mysqld start [root@centos8 ~]#/mysql/3307/bin/mysqld start [root@centos8 ~]#/mysql/3308/bin/mysqld start [root@centos8 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 80 *:3306 *:* LISTEN 0 80 *:3307 *:* LISTEN 0 80 *:3308 *:* 1.4.2.4.7 登录实例 [root@centos8 ~]#/mysql/3308/bin/mysqld start #两种连接方法 [root@centos8 ~]#mysql -h127.0.0.1 -P3308 [root@centos8 ~]#mysql -uroot -S /mysql/3308/socket/mysql.sock #确认连接的端口 MariaDB [(none)]> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3308 | +---------------+-------+ 1 row in set (0.001 sec) MariaDB [(none)]> #关闭数据库,需要手动输入root的密码 [root@centos8 ~]#/mysql/3308/bin/mysqld stop Stoping MySQL... Enter password: [root@centos8 ~]#/mysql/3308/bin/mysqld start Starting MySQL... 1.4.2.4.8 修改root密码 #加上root的口令 [root@centos8 ~]#mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password '123456' [root@centos8 ~]#mysqladmin -uroot -S /mysql/3307/socket/mysql.sock password '123456' [root@centos8 ~]#mysqladmin -uroot -S /mysql/3308/socket/mysql.sock password '123456' #或者登录mysql,执行下面也可以 Mariadb>update mysql.user set password=password("123456") where user='root'; Mariadb>flush privileges; #重复步骤,分别修改别外两个实例3307,3308对应root口令 1.4.2.4.9 测试连接 [root@centos8 ~]#mysql -uroot -p -S /mysql/3306/socket/mysql.sock #提示输入口令才能登录 1.4.2.4.10 开机启动 [root@centos8 ~]#vi /etc/rc.d/rc.local #在最后一行加下面内容 for i in {3306..3308};do /mysql/$i/bin/mysqld start;done [root@centos8 ~]#chmod +x /etc/rc.d/rc.local