1. MySql介绍

MySQL是一个关系型数据库管理系统 , 由瑞典MySQL AB公司开发 , 属于 Oracle旗下产品。MySQL 是最流行的关系型数据库管理系统之一 , 在WEB应用方面 , MySQL是最好的 RDBMS (Relational Database Management System , 关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统 , 关系数据库将数据保存在不同的表中 , 而不是将所有数据放在一个大仓库内 , 这样就增加了速度并提高了灵活性。

MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策 , 分为社区版和商业版 , 由于其体积小、速度快、总体拥有成本低 , 尤其是开放源码这一特点 , 一般中小型网站的开发都选择MySQL作为网站数据库。

1.1 MySql 主要分支

目前业界的MySQL主流分支版本有Oracle官方版本的MySQLPercona ServerMariaDB

1.1.1 Percona Server

Percona ServerMySQL重要的分支之一 , 它基于InnoDB存储引擎的基础上 , 提升了性能和易管理性 , 最后形成了增强版的XtraDB引擎 , 可以用来更好地发挥服务器硬件上的性能。所以Percona Server也可以称为增强的MySQL与开源的插件(plugin) 的结合。由于官方版本的MySQL在一些特性的使用上有一定的局限性 , 需要收费。所以Percona Server就有了一定的市场占有比例 , 也比较受大家的欢迎。像一些常用的工具包xtrabackuppercona-toolkit等 , 在生产环境中是DBA的必备武器。还有像XtraDB-Cluster这种支持多点写入的强同步高可用集群架构 , 真正实现实时同步的过程 , 解决了MySQL主从复制之间经常出现并让人头疼的延迟问题。而且Percona还收购了TokuDB公司 , TokuDB存储引擎非常优秀 , 淘宝网、阿里云上大量在使用这款存储引擎。它支持数据压缩 , 支持hot scheme modification , 它的高扩展性和优秀的查询插入性能都是我们喜欢它的地方。

需要注意的是 , Percona Server 虽然是开源的 , 但是他们自己管理代码 , 不接受外部开发人员的贡献 , 以这种方式确保他们对产品中所包含功能的控制。

1.1.2 Mariadb

MariaDB数据库管理系统MySQL的一个分支 , 主要由开源社区在维护 , 采用GPL授权许可 MariaDB的目的是完全兼容MySQL , 包括API命令行 , 使之能轻松成为MySQL的代替品。在存储引擎方面 , 使用XtraDB(英语 : XtraDB)来代替MySQLInnoDBMariaDBMySQL的创始人Michael Widenius(英语 : Michael Widenius)主导开发 , 他早前曾以10亿美元的价格 , 将自己创建的公司MySQL AB卖给了SUN , 此后 , 随着SUN被甲骨文收购 , MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael WideniusMaria的名字。

MariaDB基于事务的Maria存储引擎 , 替换了MySQLMyISAM存储引擎 , 它使用了PerconaXtraDB , InnoDB的变体 , 分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。

Mariadb是由MySQL创始人Monty创建的 , 是一款高度兼容的MySQL产品 , 主要由开源社区维护 , 采用GPL授权许可。OracleMySQL收购之后 , 为避免MySQL在开源粒度上的下降 , MariaDB由此而生。它不仅仅是MySQL的一个替代品 , 还创新与提高了MySQL原有的技术。既包含了PerconaXtraDB存储引擎 , 还包含TokuDB存储引擎、Spider水平分片存储引擎等多种存储引擎 ,并且还有一些复制功能上的新特性 , 比如基于表的并行复制、Multi-source Replication多源复制、Galera Cluster集群。还有比较有意思的一点就是MariaDB有一套Java的管理系统 , 可以通过投票机制来决定哪些特性和参数是我们需要的。

Percona Server不同 , MariaDB是一个"开放"的分支 , Monty为了避免它闭源特别成立了一个基金会( https://mariadb.org/) , 把MariaDB放在基金会里 , 基金会无法进行商业活动 , 也就不会步MySQL的后尘。当然 , 也有一个对应的MariaDB公司(https://mariadb.com/) , 提供内部QA稳定性测试、商业套件、订阅服务、培训、甚至定制化开发服务等 , 所以即使MariaDB这个公司被收购了 , 也不会影响到MariaDB本身的发展。

1.1.3 相关地址

1.2 MySql特性

  • 插件式存储引擎 : 也称为“表类型” , 存储管理器有多种实现版本 , 功能和特性可能均略有差别 ; 用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎 。 MyISAM ==> Aria , InnoDB ==> XtraDB

  • 单进程 , 多线程

  • 诸多扩展和新特性

  • 提供了较多测试组件

  • 开源

2. MySql 安装

如果需要安装Mariadb数据库 , 可以通过访问Mariadb的官网下载对应的安装包。

2.1 yum安装

安装时可以直接通过官方提供的光盘来安装数据库服务。

  • CentOS8光盘中软件版本

    • mysql-server : 8.0

    • mariadb-server : 10.3.17

  • CentOS7光盘中软件版本

    • mariadb-server : 5.5 服务器包

    • mariadb : 客户端工具包

  • CentOS6 :

    • mysql-server : 5.1 服务器包

    • mysql : 客户端工具包

直接访问Mariadb官网 , 点击Download

可以按照图中筛选mairadb的版本。并复制对应的repo配置文件。


之后直接使用以下命令安装Mariadb服务器端与客户端软件。

sudo yum install MariaDB-server MariaDB-client

需要注意的是mysql在官网下载对应需要版本的mysql时, 会直接下载所有需要版本的rpm包。之后直接在本地解压之后, 使用yum localinstall *.rpm 安装这些软件包。安装过程中会从yum源中下载部分依赖包。

安装并启动之后, 首次启动过程中会生成默认一个密码。默认密码位置: /var/log/mysqld.log。如下日志中. 默认密码为PVA&Vs5y4TrU

[root@master ~]# tail /var/log/mysqld.log 
2024-12-09T16:52:34.949035Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: PVA&Vs5y4TrU
2024-12-09T16:52:44.327951Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
2024-12-09T16:52:44.403506Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-12-09T16:52:44.713010Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 9.1.0) starting as process 30911
2024-12-09T16:52:44.754745Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-12-09T16:52:47.176411Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-12-09T16:52:48.870161Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-12-09T16:52:48.870245Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-12-09T16:52:48.996379Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '9.1.0'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.
2024-12-09T16:52:48.996295Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock

之后需要修改对应的用户密码。这里的密码有本身的安全限制。

[root@master ~]# mysql -uroot -p'PVA&Vs5y4TrU'
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 8
Server version: 9.1.0

Copyright (c) 2000, 2024, 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.

mysql> SHOW VARIABLES LIKE 'validate_password%';
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER root@'localhost' IDENTIFIED BY 'P@ssw0rd';
Query OK, 0 rows affected (0.02 sec)

#设置root用户可以远程登录
mysql> update mysql.user set host='%' where user='root';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

#mysql默认安全限制如下
mysql> SHOW VARIABLES LIKE 'validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
8 rows in set (0.02 sec)

2.2 二进制安装

首先需要在mariadb官网中下载二进制包。同时解压到root家目录下面。

  1. 准备编译环境,创建mysql用户

    [root@centos7 ~]# groupadd -r -g 306 mysql
    [root@centos7 ~]# useradd -r -g 306 -u 306 -s /sbin/nologin mysql
    [root@centos7 ~]# id mysql
    uid=306(mysql) gid=306(mysql) groups=306(mysql)
  2. 解压mairadb二进制安装包

    [root@centos7 ~]# tar -xf mariadb-10.7.3-linux-systemd-x86_64.tar.gz  -C /usr/local/
    [root@centos7 ~]# cd /usr/local/
    [root@centos7 local]# ln -sv mariadb-10.7.3-linux-systemd-x86_64  mysql
    ‘mysql’ -> ‘mariadb-10.7.3-linux-systemd-x86_64’
    [root@centos7 ~]# chown -R root:root /usr/local/mysql/
    [root@centos7 local]# echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
  3. 准备配置文件

    [root@centos7 ~]# mkdir /mysqldb/mysql1/ -pv
    [root@centos7 ~]# cat /etc/my.cnf
    [mysqld]
    datadir=/mysqldb/mysql1/
  4. 创建数据库文件

    [root@centos7 ~]# cd /usr/local/mysql/
    [root@centos7 mysql]#  ./scripts/mysql_install_db --user=mysql --datadir=/mysqldb/mysql1/ --basedir=/usr/local/mysql/

    不能直接在/usr/local/mysql/scripts目录下运行创建数据库文件的脚本,需要切换至安装数据库数据的目录下。否则会报如下错误

    [root@centos7 scripts]# ./mysql_install_db --datadir=/data/mysqldb --user=mysql
    ​
    FATAL ERROR: Could not find ./bin/my_print_defaults
    ​
    If you compiled from source, you need to either run 'make install' to
    copy the software into the correct location ready for operation.
    If you don't want to do a full install, you can use the --srcdir
    option to only install the mysql database and privilege tables.
    ​
    If you are using a binary release, you must either be at the top
    level of the extracted archive, or pass the --basedir option
    pointing to that location.
    ​
    The latest information about mysql_install_db is available at
    https://mariadb.com/kb/en/installing-system-tables-mysql_install_db
    ​

  5. 创建启动文件链接

    [root@centos7 ~]# ln -sv /usr/local/mysql/support-files/systemd/* /usr/lib/systemd/system/
    [root@centos7 ~]# systemctl daemon-reload
    [root@centos7 ~]# systemctl start mariadb

    或者通过/usr/local/mysql/support-files/mysql.server文件启动服务

    /usr/local/mysql/support-files目录下面的文件mysql.server文件拷贝到/etc/init.d/目录下面,该文件为mysql服务启动文件。

    [root@centos7 support-files]# cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld

    使用chkconfig 添加服务

    [root@centos7 support-files]# chkconfig --add mysqld
    [root@centos7 support-files]# chkconfig  --list
    ​
    Note: This output shows SysV services only and does not include native
          systemd services. SysV configuration data might be overridden by native
          systemd configuration.
    ​
          If you want to list systemd services use 'systemctl list-unit-files'.
          To see services enabled on particular target use
          'systemctl list-dependencies [target]'.
    ​
    mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
    netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
    network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
    ​
  6. 安全初始化数据库

    [root@centos7 ~]# mysql_secure_installation
    ​#主要功能
    设置数据库管理员root口令
    禁止root远程登录
    删除anonymous用户帐号
    删除test数据库

    运用该命令时会出现如下报错。

    [root@centos7 ~]# mysql_secure_installation 
    ​
    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    ​
    In order to log into MariaDB to secure it, we'll need the current
    password for the root user. If you've just installed MariaDB, and
    haven't set the root password yet, you should just press enter here.
    ​
    Enter current password for root (enter for none): 
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    以上报错的原因是因为mysql_secure_install脚本中固定只是认/tmp/mysql.sock , 这个sock文件 解决这个文件可以将/etc/my.cnf配置文件中将sock文件设置为/tmp/mysql.sock,或者修改mysql_secure_install脚本中的内容,在下面函数中添加echo "socket=/run/mysqld/mysqld.sock" >>$config

    make_config() {
        echo "# mysql_secure_installation config file" >$config
        echo "[mysql]" >>$config
        echo "user=root" >>$config
        esc_pass=`basic_single_escape "$rootpass"`
        echo "password='$esc_pass'" >>$config
        echo "socket=/run/mysqld/mysqld.sock" >>$config
        #sed 's,^,> ,' < $config  # Debugging
    ​
        if test -n "$defaults_file"
        then
            dfile=`parse_arg "$defaults_file"`
            cat "$dfile" >>$config
        fi
    }

2.3 源码安装

直接在官网中下载所需版本的源码文件。


  1. 首先需要mariadb官网中下载二进制包。同时解压root家目录下面。

    [root@centos7 ~]# wget https://mirrors.aliyun.com/mariadb//mariadb-10.3.34/source/mariadb-10.3.34.tar.gz
  2. 准备编译环境,创建mysql用户,数据库存放位置以及数据库安装位置和准备开发环境。

    [root@centos7 ~]# useradd -r -s /sbin/nologin   mysql
    [root@centos7 ~]# id mysql
    uid=998(mysql) gid=996(mysql) groups=996(mysql)
    [root@centos7 ~]# mkdir /mysqldb
    [root@centos7 ~]# mkdir -pv /app/mysql 
    [root@centos7 ~]# chown mysql.mysql /mysqldb/
    [root@centos7 ~]# chown -R  mysql.mysql /app/mysql/
    [root@centos7 ~]#yum -y install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
  3. 解压并编译mariadb源码

    [root@centos7 ~]# tar -xf mariadb-10.4.12.tar.gz 
    [root@centos7 ~]# cd mariadb-10.4.12
    [root@node3 mariadb-10.4.12]# cmake . \
    -DCMAKE_INSTALL_PREFIX=/app/mysql \
    -DMYSQL_DATADIR=/mysqldb/ \
    -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=/tmp/mysql.sock \
    -DDEFAULT_CHARSET=utf8 \
    -DDEFAULT_COLLATION=utf8_general_ci
    [root@node3 mariadb-10.4.12]# make && make install

    编译过程中会出现如下报错,以下报错信息表示缺少ncurses-develrpm包。直接使用yum install ncurses-devel

    安装包之后 , 如果直接编译会出现以下报错,提示仍然缺少ncurses-devel包。此时直接将目录中的编译文件删掉,重新解压一遍mariradb的二进制包即可。

    如果出现上面报错 , 需要运行一下命令。

    [root@centos7 mariadb-10.4.12]# rm -rf *
    [root@centos7 mariadb-10.4.12]# cd ..
    [root@centos7 ~]# tar -xf mariadb-10.4.12.tar.gz
  4. 编译完成之后,需要有以下操作

    [root@centos7 mariadb-10.3.34]# echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
    [root@centos7 mariadb-10.3.34]# . /etc/profile.d/mysql.sh
    [root@centos7 mariadb-10.3.34]# cd /app/mysql/
    [root@centos7 mysql]# ./scripts/mysql_install_db --datadir=/mysqldb/ --user=mysql
    Installing MariaDB/MySQL system tables in '/mysqldb/' ...
    OK
    
    To start mysqld at boot time you have to copy
    support-files/mysql.server to the right place for your system
    
    
    PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
    To do so, start the server, then issue the following command:
    
    './bin/mysql_secure_installation'
    
    which will also give you the option of removing the test
    databases and anonymous user created by default.  This is
    strongly recommended for production servers.
    
    See the MariaDB Knowledgebase at http://mariadb.com/kb
    
    You can start the MariaDB daemon with:
    cd '.' ; ./bin/mysqld_safe --datadir='/mysqldb/'
    
    You can test the MariaDB daemon with mysql-test-run.pl
    cd './mysql-test' ; perl mysql-test-run.pl
    
    Please report any problems at http://mariadb.org/jira
    
    The latest information about MariaDB is available at http://mariadb.org/.
    
    Consider joining MariaDB's strong and vibrant community:
    https://mariadb.org/get-involved/
  5. 之后设置mysql启动服务脚本

    [root@centos7 ~]#cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld  
    [root@centos7 ~]#chkconfig --add mysqld
    [root@centos7 ~]#service mysqld start

2.4 多实例安装

安装的话 , 服务器只需要安装一份。

[root@node1 ~]# mkdir /mysqld/{3306,3307,3308}/{etc,socket,pid,log,data} -p
[root@node1 ~]# chown -R mysql:mysql /mysqld/
[root@node1 ~]# mysql_install_db --datadir=/mysqld/3306/data/ --user=mysql  --basedir=/usr 
# 源码编译时需要特别指定--basedir=/usr 目录位置.
#查询这个选项可以通过命令:
[root@node1 ~]# mysql -e 'show variables like  "basedir";'

[root@node1 ~]# mysql_install_db --datadir=/mysqld/3307/data/ --user=mysql  --basedir=/usr 

[root@node1 ~]# mysql_install_db --datadir=/mysqld/3308/data/ --user=mysql  --basedir=/usr 

# 之后编辑每个目录中的my.cnf文件
[root@node1 mysqld]# cat /mysqld/3306/etc/my.cnf
[mysqld]
port= 3306
datadir=/mysqld/3306/data
socket=/mysqld/3306/socket/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/mysqld/3306/log/mariadb.log
pid-file=/mysqld/3306/pid/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

## 3307 , 3308端口配置文件类似只需要修改端口号即可

#之后给每一个端口的目录中分配一个启动的脚本 , 脚本内容如下
[root@node1 3306]# cat /mysqld/3306/mysqld 
#!/bin/bash

port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/bin"
# 这个选项需要按照现实情况修改 ,  具体的修改方式就是按照
mysql_basedir="/mysqld"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

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
}

function_stop_mysql()
{
	if [ ! -e "$mysql_sock" ];then
	  printf "MySQL is stopped...\n"
	  exit
	else
	  printf "Stopping MySQL...\n"
	  ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
	fi 
}

function_restart_mysql()
{
	printf "Restarting MySQL...\n"
	function_stop_mysql
	sleep 2
	function_start_mysql
}

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}"

之后给脚本赋予执行权限并启动服务即可

[root@node1 3306]# chmod 700 /mysqldb/3307/mysqld
[root@node1 3306]# /mysqldb/3307/mysqld start 

检查服务是否启动

[root@node1 3306]# ss -ntlp
State       Recv-Q Send-Q                                     Local Address:Port                                                    Peer Address:Port              
LISTEN      0      100                                            127.0.0.1:25                                                                 *:*                   users:(("master",pid=1127,fd=13))
LISTEN      0      32                                                     *:1194                                                               *:*                   users:(("openvpn",pid=979,fd=5))
LISTEN      0      128                                                    *:22                                                                 *:*                   users:(("sshd",pid=984,fd=3))
LISTEN      0      100                                                [::1]:25                                                              [::]:*                   users:(("master",pid=1127,fd=14))
LISTEN      0      80                                                  [::]:3306                                                            [::]:*                   users:(("mysqld",pid=2431,fd=20))
LISTEN      0      80                                                  [::]:3307                                                            [::]:*                   users:(("mysqld",pid=2552,fd=20))
LISTEN      0      80                                                  [::]:3308                                                            [::]:*                   users:(("mysqld",pid=2670,fd=20))
LISTEN      0      128                                                 [::]:22                                                              [::]:*                   users:(("sshd",pid=984,fd=4))

可以看到330633073308端口都已经开启了,之后尝试用命令连接服务器,需要注意的是mysql命令连接数据库时,默认连接数据库的socket文件为:/var/lib/mysql/mysql.sock。所以连接数据库时需要指定数据库文件。

[root@node1 ~]# mysql -S /mysqld/3306/socket/mysql.sock 

之后使用可以看到。

2.5 安装脚本

此次的自动化安装二进制mariadb脚本文件,详细说明在配置文件中,脚本需要修改的部分已经做了注释。

[root@centos7 src]# cat mysql.sh
#!/bin/bash
DIR=`pwd`  # 最好将下载的二进制数据库存放在/usr/local/src目录下
NAME="mariadb-10.2.29-linux-x86_64.tar.gz"  # 下载的二进制mariadb数据库
FULL_NAME=${DIR}/${NAME}
DATA_DIR="/data/mysql"  # 数据库目录
 
yum install vim gcc gcc-c++ wget autoconf  net-tools lrzsz iotop lsof iotop bash-completion -y
yum install curl policycoreutils openssh-server openssh-clients postfix -y
 
if [ -f ${FULL_NAME} ];then
    echo "安装文件存在"
else
    echo "安装文件不存在"
    exit 3
fi
if [ -h /usr/local/mysql ];then # 判断目录是否有链接
    echo "Mysql 已经安装"
    exit 3
else
    tar xvf ${FULL_NAME}   -C /usr/local/src
    ln -sv /usr/local/src/mariadb-10.2.29-linux-x86_64  /usr/local/mysql # 将数据库版本号修改
    if id  mysql;then
        echo "mysql 用户已经存在,跳过创建用户过程"
    fi
        useradd  mysql  -r -s /sbin/nologin  -d /data/mysql
    if  id  mysql;then
        chown  -R mysql.mysql  /usr/local/mysql/* -R
        if [ ! -d  /data/mysql ];then
            mkdir -pv /data/mysql && chown  -R mysql.mysql  /data  
            /usr/local/mysql/scripts/mysql_install_db  --user=mysql --datadir=/data/mysql  --basedir=/usr/local/mysql/
        cp  /usr/local/src/mariadb-10.2.29-linux-x86_64/support-files/mysql.server  /etc/init.d/mysqld   # 将数据库版本号进行修改
        chmod a+x /etc/init.d/mysqld
        cp ${DIR}/mariadb-10.2.29-linux-x86_64/support-files/my-huge.cnf   /etc/my.cnf   # 将数据库版本号进行修改
            ln -sv /usr/local/mysql/bin/mysql  /usr/bin/mysql
            sed -r -i  '/^\[mysqld\]/adatadir=/data/mysql' /etc/my.cnf   # 用sed命令在数据库配置文件中添加/data/mysql数据库存放目录,否则数据库无法启动。
            cd /etc/init.d/
            /usr/sbin/chkconfig --add mysqld
            /usr/sbin/chkconfig mysqld on  #  设置为开机启动
            echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
            source /etc/profile.d/mysql.sh
        /etc/init.d/mysqld start
    else
            echo "MySQL数据目录已经存在,"
            exit 3
    fi
    fi
fi

3. MySql命令

3.1 相关程序

  • 客户端程序

    • mysql : 交互式的CLI工具

    • mysqldump : 备份工具,基于mysql协议向mysql发起查询请求。并将查得的所有数据转换成insert 等写操作保存文本文件中。

    • mysqladmin : 基于mysql协议管理mysqld

    • mysqlimport : 数据导入工具

  • MyISAM存储引擎的管理工具

    • myisamchk : 检查MyISAM

    • myisampack : 打包MyISAM表。只读

  • 服务器端程序

    • mysqld_safe

    • mysqld : mysql 服务器端默认启动程序

    • mysqld_multi : 多实例, 示例: mysqld_multi --example

3.2 运行命令类型

  • 客户端命令。在客户端交互模式下,有内置的命令。每个命令都完整形式和简写格式.

    • ?,(\?) : 查看语法帮助

    • clear(\c) : 清空当前输入的语句。

    • connect(\r) : 重新连接服务器

    • delimiter(\d) : 设置语句分割符(结束符)。

    • edit(\e) : 编辑命令

    • ego(\G) : 发送命令至服务器 , 垂直显示结果

    • exit(\q) : 退出客户端交互模式。同样可以使用quit

    • go(\g) : 发送命令至服务器。

    • help(\h) : 显示帮助手册,和?类似。

    • nopager(\n) : 退出pager模式。

    • pager(\P) : 设置为pager模式,执行输出的方式。

    • notee(\t) : 退出tee模式。

    • tee(\T) : 将输入与输出全部都放在指定的文件中

    • pager(\P) : 设置为pager模式,执行输出的方式。

    • prompt(\R) : 修改mysql的提示符

    • quit(\q) : 退出mysql客户端。

    • status(\s) :获取mysql 服务器端的状态信息。

    • system(\!) : 执行系统shell命令。

    • use(\u) : 将数据库的名字作为参数。使用另一个数据库

    • charset(\C) : 修改客户端的字符编码。

    • warnings(\W) : 每种状态信息之后会显示警告。

    • nowarning(\w) : 每种状态信息之后不会显示警告

    示例

    MariaDB [(none)]> status
    --------------
    mysql  Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1
    ​
    Connection id:      10
    Current database:   
    Current user:       root@localhost
    SSL:            Not in use
    Current pager:      stdout
    Using outfile:      ''
    Using delimiter:    ;
    Server:         MariaDB
    Server version:     5.5.65-MariaDB MariaDB Server
    Protocol version:   10
    Connection:     Localhost via UNIX socket
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    latin1
    Conn.  characterset:    latin1
    UNIX socket:        /var/lib/mysql/mysql.sock
    Uptime:         5 hours 39 min 0 sec
    ​
    Threads: 1  Questions: 44  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.002
    --------------
    ​
    MariaDB [(none)]> charset utf8
    Charset changed
    MariaDB [(none)]> status
    --------------
    mysql  Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1
    ​
    Connection id:      10
    Current database:   
    Current user:       root@localhost
    SSL:            Not in use
    Current pager:      stdout
    Using outfile:      ''
    Using delimiter:    ;
    Server:         MariaDB
    Server version:     5.5.65-MariaDB MariaDB Server
    Protocol version:   10
    Connection:     Localhost via UNIX socket
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    UNIX socket:        /var/lib/mysql/mysql.sock
    Uptime:         5 hours 39 min 17 sec
    ​
    Threads: 1  Questions: 47  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.002
    --------------
    MariaDB [(none)]>\R MariaDB \u@\h : \d\r:\m:\s>
    MariaDB root@localhost : (none)06:39:03>
  • 服务端命令 : 通过mysql协议发往服务器执行并取回结果 , 命令末尾都必须使用命令结束符号 , 默 认为分号

    #示例 : 
    mysql>SELECT VERSION();

3.3 MySql使用模式

  • 交互模式 : 直接使用mysql命令可以直接进入交互模式。交互模式属于MySql的常用模式

  • 脚本模式

    mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
    cat /path/somefile.sql | mysql –uUSERNAME -pPASSWORD
    mysql>source /path/from/somefile.sql

3.4 mysql命令

mysql命令行工具

  • 语法 : mysql [options] db_name

    • shell> mysql db_name

    • shell> mysql --user=user_name --password=your_password db_name

    • shell> mysql db_name < script.sql > output.tab

  • OPTIONS

    • -A,--no-auto-rehash : 禁止补全

    • --default-character-set=name : 设置客户端默认的字符集

    • --delimiter=name : 设置默认的结束符

    • -C,--compress : 启用压缩

    • -D,--database=name : 连接服务器端之后,指定数据库为默认数据库

    • -u,--user=name : 登录用户名

    • -p,--password[=name] :登录密码,默认为空

    • -P,--port=# : 设置mysql服务器端的端口,默认为3306/tcp

    • --prompt=name : 修改客户端的提示符

    • -S,--socker=name : 指定套接字文件的路径

    • --protocol=name : 指定服务器端链接的协议:tcp,socket,pipe,memory

    • -e,--execute='SQL STATEMENT' : 连接至服务器并让其执行此命令后直接退出;

    • -h,--host=name : 远程mysql服务器地址,默认为localhost;

    • -V,--version :显示版本

    • -v,--verbose :显示详细信息

    • --print-defaults : 获取程序默认使用的配置

    • -U,--safe-updates : 更新或删除语句必须有where 条件限制

注意: mysql的用户账号由两部分组成 : 'USERNAME'@'HOST'; 其中HOST用于限制此用户可通过哪些远程主机连接当前的mysql服务;

  • HOST的表示方式 , 支持使用通配符:

  • % : 匹配任意长度的任意字符: 172.16.%.%, 172.16.0.0/16

  • _ : 匹配任意单个字符;

示例 :

#默认空密码登录
mysql -uroot -p
​
#运行mysql命令
MariaDB [(none)]> use mysql;
MariaDB [mysql]> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.001 sec)
​
MariaDB [mysql]> SELECT User,Host,Password FROM user;
+-------------+-----------+----------+
| User        | Host      | Password |
+-------------+-----------+----------+
| mariadb.sys | localhost |          |
| root        | localhost | invalid  |
| mysql       | localhost | invalid  |
| PUBLIC      |           |          |
|             | localhost |          |
|             | mariadb   |          |
+-------------+-----------+----------+
6 rows in set (0.002 sec)
​
​
#查看mysql版本
[root@centos7 ~]# mysql  -V
mysql  Ver 15.1 Distrib 10.4.24-MariaDB, for Linux (x86_64) using readline 5.1
​
#临时修改mysql提示符
[root@centos7 ~]# mysql   --prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"
05:35:35(root@localhost) [(none)]> 
​
#临时修改mysql提示符
[root@centos7 ~]# export MYSQL_PS1="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_"

示例: 配置客户端的mysql的自动登录

[root@centos7 ~]# vim /etc/my.cnf.d/mysql-clients.cnf
[client]
user=wang
password=centos

3.5 mysqladmin

语法格式 : mysqladmin [options] command [command-arg] [command [command-arg]] ...

  • options

    • -c number :自动运行次数统计, 必须和 -i 一起使用

    • -i number ,--sleep=#: 间隔多长时间重复执行。

      #每隔两秒查看一次服务器的状态, 总共重复5次
      ./mysqladmin -uroot -p -i 2 -c 5 status  
    • -h,--host=name : 连接的主机名或IP

    • -f,--force : 即使发生SQL错误, 也要继续

    • --default-character-set= : 指定默认字符集

    • -p,--password[=name] : 登录密码, 如果不写于参数后,则会提示输入

    • -P,--port=# :指定数据库端口

    • -s, --silent : 如果不能建立与服务器的连接则以沉默方式退出。

    • -S,--socket : 指定socket file

    • -u,--user=name : 登录数据库用户名

    • --compress,-C : 压缩客户和服务器之间发送的所有信息(如果两者均支持压缩)

    • --protocol={TCP|SOCKET|PIPE|MEMORY} : 用于连接的协议(TCP、套接字、管道、内存)

    • -v : 显示详细信息

    • -V : 显示版本

  • command

    • create db_name : 创建一个名为db_name 的新数据库

    • drop db_name : 删除名为db_name的数据库和所有表

    • extended-status : 显示服务器状态变量及其值。

    • flush-hosts : 刷新主机缓存中的所有信息

    • flush-logs : 刷新所有日志

    • flush_privileges : 重载授权表,刷新授权(类似reload)

    • kill id,id,... : 杀死MySQL线程

    • password [new-password] : 修改用户密码

    • ping : 检测MySQL是否活着

    • processlist : 显示服务器中活动线程的列表

    • reload : 重新加载授权表

    • refresh : 刷新所欲表并关闭再打开日志文件

    • shutdown : 关闭服务

    • status : 从服务器发出简短的状态信息

    • start-slave : 启动主动复制

    • stop-slave : 暂停主从复制

    • variables : 打印可以变量

    • version : 获取服务的版本信息

[root@centos7 ~]# mysqladmin -uroot -pdaemon status 
Uptime: 13419  Threads: 1  Questions: 104  Slow queries: 0  Opens: 15  Flush tables: 2  Open tables: 41  Queries per second avg: 0.007
[root@centos7 ~]# mysqladmin -uroot -pdaemon processlist 
+----+------+-----------+----+---------+------+-------+------------------+----------+
| Id | User | Host      | db | Command | Time | State | Info             | Progress |
+----+------+-----------+----+---------+------+-------+------------------+----------+
| 22 | root | localhost |    | Query   | 0    |       | show processlist | 0.000    |
+----+------+-----------+----+---------+------+-------+------------------+----------+

mysqladmin status命令结果显示以下值:

uptime : MySQL服务器已运行的秒数

Threads : 活动线程(Client端)的数量

Qeustions : 自服务器启动以来, 来自Client端的问题(查询)数

Slow queries : 耗时超过long_query_time秒的查询数。

Opens : 服务器已打开的table

Flush tables : 服务器已执行的flush-*,refreshreload命令的数量 。

Open tables : 当前打开的table

示例

#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -uroot -pcentos ping
​
#关闭mysql服务, 但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
​
#创建数据库testdb
mysqladmin -uroot -pcentos create testdb
​
#删除数据库testdb
mysqladmin -uroot -pcentos drop testdb
​
#修改root密码
mysqladmin -uroot -pcentos password 'xiong'
​
#日志滚动,生产新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs
​
#查询服务器的版本
mysqladmin -uroot -pcentos version
​
#重载权限信息
mysqladmin -uroot -pcentos reload

3.6 服务器端配置

服务器端(mysqld) : 工作特性有多种配置方式

  1. 命令行选项

  2. 配置文件 : 类ini格式 ,集中式的配置 , 能够为mysql的各应用程序提供配置信息

服务器端配置文件 : /etc/my.cnf; /etc/mysql/my.cnf;~/.my.cnf

  • 配置文件格式:

    [mysqld]
    ​
    [mysqld_safe]
    ​
    [mysqld_multi]
    ​
    [mysql]
    ​
    [mysqldump]
    ​
    [server]
    ​
    [client]

    格式: parameter = value

    说明: _-相同 ; 1ONTRUE意义相同 ; 0OFFFALSE 意义相同

3.7 socket地址

服务器监听的两种socket地址 :

ip socket: 监听在tcp3306端口 , 支持远程通信 , 侦听3306/tcp端口可以在绑定有一个或全部接口IP

unix sock : 监听在sock文件上 , 仅支持本机通信, 如 : /var/lib/mysql/mysql.sock)

说明 : hostlocalhost 时自动使用unix sock

3.8 关闭mysql网络连接

只侦听本地客户端 , 所有客户端和服务器的交互都通过一个socket文件实现 , socket的配置存放在 /var/lib/mysql/mysql.sock) 可在/etc/my.cnf 修改。

范例 :

vim /etc/my.cnf
[mysqld]
skip-networking=1

4. mysql初始化

这里如果mariadb或者mysql如果需要重新安装数据库。可以通过直接删除数据库的数据目录(默认为/var/lib/mysql)。然后使用mysql_install_db命令实现数据库的初始化。这里需要注意mysql5.8版本之后这个命令就直接集成到mysqld命令中 ,通过使用 --initialize--initialize-insecure选项调用mysqld来执行。

用法举例 :

./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3306

--usermysqld服务的运行用户 --basedir--datadir则分别代表mysql的安装目录和数据存放目录

  • --basedir=path : mysql安装目录的路径

  • --datadir=path : mysql数据目录的路径

  • --skip-name-resolve :当创建授权表时,用ip地址而不是host名,这个选项在你的DNS不起作用时,非常有用。

  • --user=user_name : 运行mysqld的系统用户名,通过mysqld创建的文件和目录的归属者将为该用户。

  • --no-defaults : 不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。

#更改密码
MariaDB [(none)]> update mysql.user set password=password("centos") where user='root';
ERROR 1348 (HY000): Column 'Password' is not updatable
MariaDB [(none)]> set password for 'root'@'localhost'=password('123456');
Query OK, 0 rows affected (0.003 sec)
​
ALTER USER root@localhost IDENTIFIED BY "Password01!"


参考链接

mySQL(关系型数据库管理系统)_百度百科 (baidu.com)

MySQL与主流分支版本简介 - 知乎 (zhihu.com)

Mysql分支选择 : Percona Or MariaDB - 云+社区 - 腾讯云 (tencent.com)

新浪微博:昕-2008的博客:【MySQL】 创建表CREATE TABLE语法

熊熊