MySQL 基础

企业版

MySQL 企业版由小 ySQL AB 公司内部专门的人员负责开发及维护,但同时也会吸纳社区人员编写的优秀代码及算法,并且由他们严格按照软件测试流程对这些采纳的代码进行测试,确定没有问题之后才会进行发布。简单地说,MySQL 企业版是由 MySQL 公司内部发布的,它参考了社区版的先进代码功能和算法,是 MySQL 公司的赢利产品,需要付费才能使用及提供服务支持,稳定性和可靠性无疑都是最好的,当然了,企业腰包得够鼓才能买得起。某知名分类门户网站 2008 年就购买过 MySQL 企业版,价格不比那些闭源的商业数据库便宜,也是大几十万。

社区版

MySQL 社区版则是由分散在世界各地的 MySQL 开发者、爱好者以及用户参与开发与测试的,包括软件代码的管理、测试工作,也是他们在负责。社区也会设立 BUG 汇报机制,收集用户在使用过程中遇到的 BUG 情况,相比于企业版,社区版的开发及测试环境没有那么严格。

版本选择

mysql 软件包解释

mysql-5.6.45.tar.gz 

5 是主版本号
6 是发行级别,主版本号和发行级别组合,构成发行序列号 
45 表示在此发行系列的一个版本,随着新版本发布,进行递增

例如
mysq1-5.6.46.tar.gz
mysql-5.6.47.tar.gz
每次更新后,最后一个数字会递增
如果功能变化较大,字符串的第二个数字会递增,也就是如 5.7 
如果软件格式大改动,第一个数字,主版本号会变化

Mysql 生产环境版本选择

企业生产场景下,数据库是重中之重,因此选释 MySQL 数据库一定要慎重。下面是给出的一些选择建议。

1) 一定要选稳定版版本,即选择开源的社区版的稳定版。
2) 产品线选择,建议选择第二条产品线中的 5.5 或 5.6 版本。目前互联网公司主流版本是 5.5 和 5.6。
3) 选择 MySQL 数据库至少发布半年以上的稳定版本。
4) 要尽可能选择前后几个月没有大的 BUG 修复的版本,而不是大量修复 BUG 的集中版本。
5) 最好选择向后较长时间没有更新发布的版本。
6) 要考虑开发人员开发程序使用的版本是否兼容你所选的版本。
7) 首先作为内部开发测试数据库环境,测试运行几个月的时间。
8) 优先对企业非核心业务采用新的数据库稳定版本软件。

Mysql 5.7 安装

官方下载地址:https://downloads.mysql.com/archives/community/

rpm 包 安装

下载地址:https://mirrors.sohu.com/mysql/

# 依赖包
mysql-client
mysql-devel
mysql-server
mysql-shared


# rpm 包安装链接

yum 安装

# mariadb 
yum install -y mariadb-server mariadb

# mysql 5.7
yum -y install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum install mysql-community-server --nogpgcheck

编译安装

参考链接:https://wfc.center/database/mysql.html#mysql-5724-%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85

# 编译命令
make 读取 makefile 里面的指令,编译程序,makefile 文件里调用 gcc 命令去编译源文件
cmake 命令也是一个编译命令,用于一些跨平台的编译设置

安装之前记得 rpm -e –nodeps 卸载mariadb-libs、mysql

安装前依赖解决
cmake 命令 2.8 以上,这里使用 3.6.0 版本
https://cmake.org/download/

boost Boost库是一个可移植、提供源代码的C库,作为标准库的后备,是C标准化进程的开发引擎之一
⚠️:MySQL 5.7 要求的 boost 版本为 1.59 ;我们这里使用 1.59 版本
https://www.boost.org/

mysql获得;我们这里使用 5.7.24 版本
https://dev.mysql.com/downloads/mysql/
https://downloads.mysql.com/archives/community/

1)# 安装依赖
yum -y install ncurses-devel gcc-* bzip2-* bison cmake

2)# cmake 安装
wget https://download.wfc.center/WEB/LAMP/MySQL5.7-PHP7.4/cmake-3.6.0-rc1.tar.gz
tar xf cmake-3.6.0-rc1.tar.gz
cd cmake-3.6.0-rc1/
./configure
# 使用两个 cpu 核 一起编译;
make -j2
make install

3)# boost 安装
wget https://download.wfc.center/WEB/LAMP/MySQL5.7-PHP7.4/boost_1_59_0.tar.bz2
tar xf boost_1_59_0.tar.bz2
mv boost_1_59_0 /usr/local/boost

4) # mysql安装;
useradd -s /sbin/nologin -r mysql
mkdir -pv /usr/local/mysql/data
wget https://download.wfc.center/WEB/LAMP/MySQL5.7-PHP7.4/mysql-5.7.24.tar.gz 
tar xf mysql-5.7.24.tar.gz
cd mysql-5.7.24/

# cmake 是新编译的cmake版本
/usr/local/bin/cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  -DMYSQL_DATADIR=/usr/local/mysql/data/ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock  -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1  -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DWITH_DEBUG=0 -DWITH_EMBEDDED_SERVER=1 -DDOWNLOAD_BOOST=1  -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost

# 2cpu 同时 make
make -j2 && make install

# 编译参数
[root@test mysql]# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql     指定安装路径
-DMYSQL_DATADIR=/usr/local/mysql/data/     指定数据目录
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock      指定sock文件路径
-DWITH_INNOBASE_STORAGE_ENGINE=1             安装Innodb存储引擎
-DWITH_MYISAM_STORAGE_ENGINE=1              安装myisam存储引擎
-DENABLED_LOCAL_INFILE=1                 允许使用Load data命令从本地导入数据
-DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci   安装所有字符集、默认字符集utf-8 、校验字符
-DMYSQL_USER=mysql   mysql用户名
-DWITH_DEBUG=0       关闭debug
-DWITH_EMBEDDED_SERVER=1   生成一个libmysqld.a(.so)的库,这个库同时集成了mysql服务与客户端API
-DDOWNLOAD_BOOST=1  -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost   允许boost 允许下载boost库文件。

安装后操作

# 拷贝mysql管理脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
useradd -s /sbin/nologin -r mysql
chown mysql.mysql /usr/local/mysql/ -R
# 链接命令、man文件 
ln -sf /usr/local/mysql/bin/* /usr/bin/
ln -sf /usr/local/mysql/lib/* /usr/lib/
ln -sf /usr/local/mysql/libexec/*  /usr/local/libexec
ln -sf /usr/local/mysql/share/man/man1/*  /usr/share/man/man1
ln -sf /usr/local/mysql/share/man/man8/*  /usr/share/man/man8

修改配置文件 确保路径正确

# 确保路径配置是正确的
egrep -v "^#|^$" /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysql.log
pid-file=/var/run/mysql.pid
!includedir /etc/my.cnf.d

初始化数据库

# mysql 初始化,是为了生成 mysql 启动必备的文件
# 初始化时会生成 mysql 密码;
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/


2022-05-19T12:26:45.462080Z 1 [Note] A temporary password is generated for root@localhost: Cbjr.JRD<0P:

密码修改

# 执行该命令后,不需要进mysql再修改密码即可执行对mysql操作
/etc/init.d/mysql start
[root@zutuanxue ~]# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password:

Re-enter new password:

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: n
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

错误 排查 解决

⚠️:如果使用 arm 系统 编译安装 mysql 5.7,需要升级 gcc 版本,具体操作如下:

报错:

img

# 首先查看一下自己的gcc的版本
rpm -qa | grep gcc

# 这边服务器默认是4.8版本的,版本低需要更新。

img

# 卸载旧版本,
# rpm --nodeps -e gcc-c++-4.8.5-39.el7.aarch64 gcc-4.8.5-39.el7.aarch64    ##卸载默认的

# 安装新版本
yum install centos-release-scl
yum install devtoolset-7     ##devtoolset-7对应gcc7.x.x版本
scl enable devtoolset-7 bash   ##激活gcc,只是临时激活
gcc --version                  ##查看版本是gcc7.3.1-5

⚠️:如果 arm 版本有如下报错

img

# 进行如下配置,解决这个问题
cp /usr/include/sys/prctl.h /home/mysql-5.7.27/include

# 
vi /home/mysql-5.7.27/sql/mysqld.cc

img

按上图配置,接下来再编译安装 mysql 5.7

错误参考链接:

  1. https://cxymm.net/article/qq_43303980/115404635
  2. https://support.huaweicloud.com/intl/en-us/prtg-kunpengdbs/kunpengmysql5727_02_0012.html

mysql 多实例

什么是多实例

一句话

多实例,就是一台 linux 上,同时运行多个 mysql,当然是区别了不同的端口,例如 3306、3307、3308。运行三个 mysql 数据库

多实例 Mysql 应用场景

  1. 公司资金紧张
  2. 用户并发访问量不大的业务
  3. 大型网站有的也会使用多实例(物理服务器配置高,多实例mysql可以节省机柜资源,并且充分利用硬件资源)

image-20220627225145328

Mysql 多实例部署

image-20220627225430492

每个实例都有单独的

  • 配置文件
  • 启动脚本
  • 数据目录

Arm 源码包安装 mysql 5.7 多实例

也可以采用二进制包安装,因为测试机器是 arm 机器,所以使用 源码安装方式;

二进制包安装参考链接

# 这里使用了上边编译的 源码包

[root@centos7 ~]# mkdir -p /mysql/{3306,3307}

# 拷贝整个编译包
\cp -a /usr/local/mysql/* /mysql/3306/
\cp -a /usr/local/mysql/* /mysql/3307/
# 删除历史数据
rm -rf /mysql/3306/data/*
rm -rf /mysql/3307/data/*

# 准备实例的 my.cnf 配置文件
cat > /mysql/3306/my.cnf <<EOF
[client]
port = 3306
socket = /mysql/3306/mysql.sock
default-character-set=utf8

[mysqld]
port=3306

character-set-server=utf8
collation-server=utf8_general_ci

datadir=/mysql/3306/data
socket=/mysql/3306/mysql.sock
basedir=/mysql/3306
symbolic-links=0

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash
prompt=\\u@\\d \\R:\\m>
default-character-set=utf8

[mysqld_safe]
# log-error=/mysql/3306/mysql.log
# pid-file=/mysql/3306/mysql.pid
open-files-limit = 8192
EOF


##################
##################
cat > /mysql/3307/my.cnf <<EOF
[client]
port = 3307
socket = /mysql/3306/mysql.sock

[mysqld]
port=3307
datadir=/mysql/3307/data
socket=/mysql/3307/mysql.sock
basedir=/mysql/3306
symbolic-links=0

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash
prompt=\\u@\\d \\R:\\m>

[mysqld_safe]
# log-error=/mysql/3306/mysql.log
# pid-file=/mysql/3306/mysql.pid
open-files-limit = 8192
EOF

# mysql 管理脚本;这是 mysql 5.6 的,不适合 5.7

# 3306 实例
cat /etc/init.d/mysql3306
#!/bin/bash

port=3306
mysql_user='mysql'
Cmdpath="/usr/local/mysql/bin"
mysql_cnf="/mysql/${port}/my.cnf"
mysql_sock="/mysql/${port}/mysql.sock"
mysqld_pid_file_path="/mysql/${port}/mysqld_${port}.pid"

start(){
    if [ ! -e "$mysql_sock" ];then
        printf "Starting MySQL... \n"
        /bin/sh ${Cmdpath}/mysqld_safe --defaults-file=${mysql_cnf} --pid-file=${mysqld_pid_file_path} >> /dev/null 2>&1 &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}

stop(){
    if [ ! -e "${mysql_sock}" ]; then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stoping MySQL...\n"
        mysqld_pid=$(cat ${mysqld_pid_file_path})

        if  ( kill -0 ${mysqld_pid} 2 > /dev/null);then
            kill ${mysqld_pid}
            sleep 2
        fi
    fi
}

rstart(){
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}


case "$1" in
    start)
        start;;
    stop)
        stop;;
    restart)
        restart
        ;;
    *)
        printf "Usafe: $0 {start|stop|restart}\n"
    ;;
esac

systemctl 启动脚本

cat > /usr/lib/systemd/system/mysqld3306.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
# Type=forking
# Start main service
ExecStart=/mysql/3306/bin/mysqld --defaults-file=/mysql/3306/my.cnf --user=mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
EOF

# 3307 类似

# 
systemctl daemon-reload

# mysql 实例初始化
# 这里注意:--defaults-file 必须是第一个选项;如果将其放到后边,初始化失败
# 3306 实例
/mysql/3306/bin/mysqld  \
--defaults-file=/mysql/3306/my.cnf \
--basedir=/mysql/3306 \
--datadir=/mysql/3306/data \
--initialize --user=mysql 
或
mysqld --defaults-file=/mysql/3306/my.cnf --initialize --user=mysql --basedir=/mysql/3306 --explicit_defaults_for_timestamp



# 3307 实例
/usr/local/mysql/bin/mysqld  \
--defaults-file=/mysql/3307/my.cnf \
--basedir=/usr/local/mysql \
--datadir=/mysql/3307/data \
--initialize --user=mysql 
或
mysqld --defaults-file=/mysql/3307/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql --explicit_defaults_for_timestamp
# 启动实例
mysqld_safe --defaults-file=/mysql/3306/my.cnf --user=mysql &
mysqld_safe --defaults-file=/mysql/3307/my.cnf --user=mysql &

# 停止实例;先得登陆之后,修改密码才能shutdown
mysqladmin -u root -p'password' -S /mysql/3306/mysql.sock shutdown
mysqladmin -u root -p'password' -S /mysql/3307/mysql.sock shutdown
# 如果 shutdown 不好使,首先 
kill -0 mysqlpid
# 再
kill mysqlpid
# 连接实例
mysql -u root -p'lnhMeDFI*18#' -S /mysql/3306/mysql.sock
mysql -u root -p'93ShfPU*%4gt' -S /mysql/3307/mysql.sock
# 登陆之后修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
flush privileges;

x86 二进制包 安装 mysql 5.7.24 多实例

下载地址:https://downloads.mysql.com/archives/community/

# 二进制包下载地址
# 这里使用 自己的 下载地址;mysql 的太慢
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.24-linux-glibc2.12-x86_64.tar
或
wget https://download.wfc.center/Mysql/5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar

# 解压
tar xf mysql-5.7.24-linux-glibc2.12-x86_64.tar
tar xf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql

# 添加环境变量;这里做的是软链接
useradd -s /sbin/nologin -r mysql
chown mysql.mysql /usr/local/mysql/ -R
# 链接命令、man文件 
ln -sf /usr/local/mysql/bin/* /usr/bin/
ln -sf /usr/local/mysql/lib/* /usr/lib/
ln -sf /usr/local/mysql/libexec/*  /usr/local/libexec
ln -sf /usr/local/mysql/share/man/man1/*  /usr/share/man/man1
ln -sf /usr/local/mysql/share/man/man8/*  /usr/share/man/man8
# 创建文件夹
mkdir -p /mysql/{3306,3307}/data
chown mysql.mysql -R /mysql/

# 配置文件
cat > /mysql/3306/my.cnf <<EOF
[client]
port = 3306
socket = /mysql/3306/mysql.sock

[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/mysql.sock
basedir=/usr/local/mysql/
symbolic-links=0

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash
prompt=\\u@\\d \\R:\\m>

[mysqld_safe]
# log-error=/mysql/3306/mysql.log
# pid-file=/mysql/3306/mysql.pid
open-files-limit = 8192
EOF

###############
###############
cat > /mysql/3307/my.cnf <<EOF
[client]
port = 3307
socket = /mysql/3306/mysql.sock

[mysqld]
port=3307
datadir=/mysql/3307/data
socket=/mysql/3307/mysql.sock
basedir=/usr/local/mysql/
symbolic-links=0

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash
prompt=\\u@\\d \\R:\\m>

[mysqld_safe]
# log-error=/mysql/3306/mysql.log
# pid-file=/mysql/3306/mysql.pid
open-files-limit = 8192
EOF

初始化数据库

# 这里初始化是没有密码的
mysqld --initialize-insecure --basedir=/usr/local/mysql --user=mysql --datadir=/mysql/3306/data && echo $?
mysqld --initialize-insecure --basedir=/usr/local/mysql --user=mysql --datadir=/mysql/3307/data && echo $?

数据库管理脚本

# 3306 实例的
cat > /usr/lib/systemd/system/mysqld3306.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Type=forking

# Start main service
# ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3306/my.cnf --user=mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
EOF


# 3307 实例的
cat > /usr/lib/systemd/system/mysqld3307.service << EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Type=forking

# Start main service
# ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3307/my.cnf --user=mysql

# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
EOF
# 重载配置
systemctl daemon-reload

# 启动
systemctl start mysqld3307.service
systemctl start mysqld3306.service
# 开机启动
systemctl enable mysqld3306.service
systemctl enable mysqld3307.service
# 停止
systemctl stop mysqld3307.service
systemctl stop mysqld3306.service

# 检查
[root@ip-10-23-26-152 data]# netstat -lnpt |grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      9148/mysqld
tcp6       0      0 :::3307                 :::*                    LISTEN      9099/mysqld
# 连接;由于创建数据库的时候,没有生成密码,所以直接回车就能登陆,登陆之后修改密码;
mysql -u root -p -S /mysql/3306/mysql.sock
mysql -u root -p -S /mysql/3307/mysql.sock

多种登陆方式

mysql -u root -p -S /mysql/3306/mysql.sock
mysql -u root -p -S /mysql/3307/mysql.sock

# 端口登陆,多实例情况下,需要加 端口号
mysql -uroot -p -h127.0.0.1 -P3306

配置文件跳过密码

# mysqld 标签下 添加 skip-grant-tables ,然后重启mysql
[mysqld]
skip-grant-tables

修改密码

1. mysqladmin 修改
mysqladmin -uroot -S /mysql/3306/mysql.sock password

2. 登陆数据库修改,版本之前有区别
USE mysql;
UPDATE user SET Password = password( 'password' ) WHERE User = 'root' ;
flush privileges;

# mysql 5.7 修改root密码(平常使用)
USE mysql;
update user set authentication_string = password('password'), password_expired = 'N', password_last_changed = now() where user = 'root';
# mysql 5.7 初始化后第一次修改root密码,并且(也只能)通过这种方式修改;
alter user 'root'@'localhost' identified by 'password' 


msql 远程登录、授权

# 定义IP地址,端口号;
mysql -uroot -p -h10.0.0.1 -P3306


# 授权,授权 root 在 10.10.5.0/24 网段登录数据库,*.* 所有数据库所有表; all 所有权限
grant all privileges on *.* to root@'10.10.5.%' identified by 'password';
flush privileges;