Linux安装mysql8

1. 下载

2.卸载mariadb

1
2
3
4
5
6
7
8
#查看mariadb 的安装包
rpm -qa | grep mariadb

#卸载 mariadb
rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps

#卸载验证
rpm -qa | grep mariadb

3.安装

  1. 解压安装包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     # 进入下载目录
    cd /usr/local/src/

    #解压, 如果是.tar则用 tar -zxvf解压, 我下载的是.tar.xz包,使用的是tar -xvJf
    tar -xvJf mysql-8.0.28-linux-glibc2.17-x86_64-minimal.tar.xz

    # 移动解压后的文件夹至/usr/local
    mv /usr/local/src/mysql-8.0.28-linux-glibc2.17-x86_64-minimal /usr/local/
    cd /usr/local/

    # 重命名
    mv ./mysql-8.0.28-linux-glibc2.17-x86_64-minimal mysql8

    # 创建文件夹data,存储文件;
    cd /usr/local/mysql8/
    mkdir ./data
  2. 创建用户以及用户组

    1
    2
    3
    4
    # 用户组
    groupadd mysql
    # 用户 (用户名/密码)
    useradd -g mysql mysql
  3. 授权

    1
    2
    3
    4
    chown -R mysql.mysql /usr/local/mysql8/ 
    #
    chown -R mysql .
    chgrp -R mysql .
  4. 初始化数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查看当前所在目录
    pwd # 若显示/usr/local/mysql-8.0,请继续执行,否则请先进入此目录/usr/local/mysql-8.0
    # 初始化 注意查看是否存在相关目录,若不存在,请新建
    # 亲测
    ./bin/mysqld --user=mysql --basedir=/usr/local/mysql8/ --datadir=/usr/local/mysql8/data/ --initialize
    #
    ./bin/mysql --user=mysql --basedir=/usr/local/mysql8/ --datadir=/usr/local/mysql8/data/ --initialize ;

    #如果出现错误:./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
    yum install -y libaio #安装后在初始化就OK了


    注意:后面白色高亮选中的是初始密码!!!!

  5. 配置my.cnf

    1
    vim /etc/my.cnf

    在配置中键入如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     [mysqld]
    port=3306
    # 设置mysql的安装目录
    basedir=/usr/local/mysql8
    # 设置mysql数据库的数据的存放目录
    datadir=/usr/local/mysql8/data
    # 允许最大连接数
    max_connections=1000
    # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
    max_connect_errors=100
    # 服务端使用的字符集默认为UTF8
    character-set-server=utf8mb4
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 默认使用“mysql_native_password”插件认证
    default_authentication_plugin=mysql_native_password
    #是否对sql语句大小写敏感,1表示不敏感
    #lower_case_table_names = 1
    #MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
    #MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效
    interactive_timeout = 1800
    wait_timeout = 1800
    #Metadata Lock最大时长(秒), 一般用于控制 alter操作的最大时长sine mysql5.6
    #执行 DML操作时除了增加innodb事务锁外还增加Metadata Lock,其他alter(DDL)session将阻塞
    lock_wait_timeout = 3600
    #内部内存临时表的最大值。
    #比如大数据量的group by ,order by时可能用到临时表,
    #超过了这个值将写入磁盘,系统IO压力增大
    tmp_table_size = 64M
    max_heap_table_size = 64M
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8mb4
    [client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8mb4
  6. 建立Mysql服务

    1
    2
    3
    4
    cp -a ./support-files/mysql.server /etc/init.d/mysql
    chmod +x /etc/init.d/mysql
    chkconfig --add mysql
    chkconfig --list mysql

  7. 启动Mysql服务

    1
    2
    3
    4
    # 启动
    service mysql start;
    # 查看启动状态
    service mysql status;

    如果提示: -bash: mysql: command not found

    1
    ln -s /usr/local/mysql8/bin/mysql /usr/bin
  8. 登录Mysql

    1
    2
    mysql -uroot -p
    # 输入"初始化数据库"操作时的"临时密码"

    修改密码:

    1
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
  9. 远程连接

    1. 进入mysql命令行
      1
      2
      3
      4
      use mysql;
      update user set host ='%' where user='root';
      ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
      FLUSH PRIVILEGES;
  10. 检查端口

    1
    2
    3
    4
    5
    6
    7
    8
    #检查3306端口是否开放
    netstat -nlp|grep 3306

    #开放3306端口
    firewall-cmd --permanent --add-port=3306/tcp

    #重启防火墙
    firewall-cmd --reload

4. 常见问题

  1. The server quit without updating PID file

    • 第一,权限的问题,在出这个错误的时候,我所说的权限是mysq.cnf和所定义的mysql数据库存放目录的权限,要保证是mysql用户的权限,如果启动mysql还有问题,那么需要考虑提高权限了。
      说人话, 数据库存放目录必须是mysql这个用户的属组(通常的,安装MySQL的时候建立的用户为mysql,不建议使用别的用户),mysql的启动脚本必须有执行权限。赋予权限的命令为:chown -R mysql. /usr/local/mysql,假设我的mysql是安装在 /usr/local/mysql目录,数据库存放目录为 /usr/local/mysql/data/
    • 第二,进程中有mysql的进程,上次的退出并没有自动结束该pid,导致新的进程无法启动,毕竟,mysql每次启动系统只会给分配一个pid号,再启动,系统也不可能给你分配pid号了。运行命令 ps -ef |grep mysql 找到mysql的进程结束它,然后在启动mysql。
    • 第三,进入mysql数据库的存放目录,如果有mysql-bin.index这样的文件,删除它,在启动mysql,该文件产生的原因不详,不过删除必定没影响,或者另一个binlog.index也删除,两个index后缀的都删除也可以。
    • 第四,my.cnf 这个配置文件内容不对,检查有没有skip-federated这个字段,如果有注释或者删除。
      检查是否定义了数据库存放目录,如果没有定义,请立刻定义。
    • 第五,错误日志目录不存在解决方法:使用“chown” “chmod”命令赋予mysql目录所有者及权限。
    • 第六,my.cnf文件内存在lower_case_table_names=1 字段,注释掉它。(这个选项是1表示不区分大小写)。具体原因不详

    总结:mysql说好安装也好安装,说难也难,难点在于权限的配置,给高了不安全,给低了有可能启动出问题,如果启动出问题了,首先第一件事就是检查目录权限,第二就是检查my.cnf这个配置文件,skip-federated,lower_case_table_names=1 ,这样的字段注释掉,第三,清除旧的mysql进程,如果有就清除掉,旧的不去新的不来,就这么一个道理。第四,进入mysql数据库存放目录删除index后缀的文件。下面,给张图,详细的权限慢慢体会

    1
    ls -al /etc/init.d/mysql
  2. Can ‘t connect to local MySQL server through socket ‘/tmp/mysql.sock

    1
    2
    3
    连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果套接字文件被删除了,本地客户就不能连接。这可能发生在你的系统运行一个cron任务删除了/tmp下的临时文件。
    如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。因为服务器在启动时重新创建它。
    如果和我一样,重启服务器还是没有任何变化,你可以先执行下面的语句
    1
    mysql -uroot -h 127.0.0.1 -p

    解决方式:

    1
    2
    sudo mkdir /var/run/mysqld/
    sudo ln -s /tmp/mysql.sock /var/run/mysqld/mysqld.sock
  3. however file don’t exists. Create writable for user ‘mysql’
    问题描述:

    1
    2
    [root@test2 my57_3307]# /usr/local/mysql57/bin/mysqld_safe  --defaults-file=/dbdata/mysql/my57_3307/my57_3307.cnf  --ledir=/usr/local/mysql57/bin
    2018-08-26T14:12:45.459798Z mysqld_safe error: log-error set to '/var/log/mysqld/my57_3307.log', however file don't exists. Create writable for user 'mysql'.

    解决方式:

    1
    2
    3
    touch /usr/local/mysql8/log/error.log
    chown mysql /usr/local/mysql8/log/error.log
    /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --ledir=/usr/local/mysql8/bin
  4. cannot open shared object file: No such file or directory

    1
    2
    3
    4
    #需要安装 libnuma
    yum install libnuma
    yum -y install numactl
    yum install libaio1 libaio-dev
  5. mysqld启动报错Failed to find valid data directory

    1
    2
    3
    4
    5
    6
    7
    8
    9
    vim /etc/my.cnf #查看datadir配置项的路径,然后一般是/var/lib/mysql,将这个文件夹删掉,然后重新初始化

    /usr/local/mysql8/bin/mysqld --initialize --user=mysql

    #如果mysqld启动服务时提示不能用root启动,则在/var/lib/mysql中加入这行 user=mysql


    #重启
    service mysql restart
  6. Navicat无法连接:Host is not allowed to connect to this MySQL server

    1
    2
    mysql -uroot -p
    #输入密码

    操作数据库

    1
    2
    use mysql;
    select host from user where user='root';

    navicat无法连接数据库

    该结果表示当前的root用户限制在当前的IP内访问,需要修改他的访问域

    1
    2
    update user set host='%' where user='root';
    flush privileges ;

    navicat无法连接数据库

  7. Can’t connect to MySQL server ‘xxxxxx’ on(60)

    我买的是阿里云服务器,前往阿里云服务器配置安全组规则即可