Linux下编译安装MySQL
一、环境准备
yum install -y ncurses-devel libaio-devel
yum install -y cmake make
useradd -s /sbin/nologin -M mysql
wget --no-check-certificate https://downloads.mysql.com/archives/get/file/mysql-5.6.38.tar.gz
二、编译安装mysql
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.38 \
-DMYSQL_DATADIR=/application/mysql-5.6.38/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.38/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
make
make install
报错: CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found,需要安装gcc、gcc-c++
yum -y install gcc gcc-c++
并删除原来的mysql-5.6.13目录,重新解压缩tar.gz包
三、初始化数据库(初始化数据库(建库),初始化的是mysql基本运行所必须的一些“系统库”(元数据))
   ln -s /application/mysql-5.6.38 /application/mysql   #创建软链接
   chown -R mysql.mysql /application/mysql
   /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql  #初始化MySQL
   /application/mysql/bin/mysqld --verbose --help   #查看可配置的参数
   [root@db01 mysql]# vim /etc/my.cnf
   [mysqld]
   datadir=/application/mysql/data
   socket=/application/mysql/tmp/mysql.sock
   user=mysql
   # Disabling symbolic-links is recommended to prevent assorted security risks
   symbolic-links=0
   [mysqld_safe]
   log-error=/application/mysql/tmp/mysqld.log
   pid-file=/application/mysql/tmp/mysqld.pid
   cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
   /etc/init.d/mysqld start
   echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile    #把mysql加入到环境变量
   source /etc/profile
四、密码破解
  1、方法一:
    [root@db01 mysql]# mysqld_safe --skip-grant-tables  --skip-networking &  #以“安全模式”登录数据库,并禁止远程登陆
    mysql> update mysql.user set password=PASSWORD('110') where user='root' and host='localhost';
  2、方法二:
    [root@db01 mysql]# vim /etc/my.cnf
    [mysqld]
    skip-grant-tables      #在my.cnf文件中加上这句(跳过mysql授权表),修改完密码后注释或删除
    [root@db01 mysql]# /etc/init.d/mysqld restart #重启MySQL服务 
    [root@db01 mysql]# mysql #登录MySQL 
    mysql> select user(); #查看登录用户是否为root
    mysql> update mysql.user set password=password("123") where user="root" and host="localhost"; #修改密码为123 
    mysql> flush privileges;
  注:
      5.7中不再使用password字段进行存储密码,使用authentication_string来替代,修改命令如下:
      mysql> update mysql.user set authentication_string=PASSWORD('123') where user='root' and host='localhost';
五、MySQL工作流程
   1、客户端发起 登录数据库命令:
       mysql -uroot -p110
   2、服务器接收到连接命令
       2.1 提供连接协议(TCP/IP、socket)
       2.2 用户密码验证模块,通过mysql.user表中记录的用户信息,检验客户端发送过的用户密码
       2.3 分配一个专门的连接线程和当前对接工作,接收SQL(不负责处理SQL),将SQL交给SQL继续处理,最后返回结果。
   3、SQL层接收到上层传送过来的SQL语句(select user,password,host from mysql.user;)
       3.1 通过语法模块判断语法,如果语法通过,交到语义判断模块。
       3.2 语义判断模块判断语义,
             判断一下是什么类型的SQL语句(DML、DDL、DCL、DQL),会将不同的类型的SQL交给不同的SQL解析器解析
             操作对象是什么,并进行权限判断
       3.3 SQL解析器解析SQL语句,解析成1种或多种执行计划(explain)
       3.4 优化器拿到多种执行计划,进行判断,选择他觉得更优的执行计划,交给执行器
       3.5 执行器按照执行计划进行SQL执行,生成获取数据的方法(哪个数据文件的哪个页上),交由下层继续处理
       3.6 将上次运行过的SQL语句本身进行hash,加上语句的执行结果(获取的数据),放到查询缓存中一份。
             注:一般情况下我们可以通过redis memecahe来代替这项功能。
       3.7 查询日志记录:binlog
	
   4、存储引擎层接受到SQL层处理后的结果,从磁盘获取到相应的数据。再返回给SQL进行结构化成表的形式,再显示给用户。
六、配置文件(/etc/my.cnf)
   1、能影响什么?
        服务启动[server]:mysqld、mysqld_safe
        客户端链接[client]:mysql、mysqladmin、mysqldump
   2、配置示例:
        vim /etc/my.cnf	
        [server]
        basedir=/application/mysql
        datadir=/application/mysql/data
        socket=/tmp/mysql.sock
        log-error=/var/log/mysql.log
        log_bin=/data/mysql/mysql-bin
        binlog_format=row
        skip_name_resolve=1
        server_id=3306    
        port=3306
        [client]
        socket=/tmp/mysql.sock
   注:
         使用/application/mysql/bin/mysqld --verbose --help查到的参数都可以写到配置文件里,写到配置文件里时去掉参数前的--
   3、配置文件的读取顺序
         /etc/my.cnf → /etc/mysql/my.cnf → $MYSQL_HOME/my.cnf → ~/.my.cnf → --defaults-extra-file 
     
  注意:
        1、多个配置文件中都有socket=xxx.sock,且每个配置文件中的值都不一样时按照以上顺序,最后一个为准
        2、如果设置了 --defaults-file=/tmp/aa.txt,会忽略以上所有的配置信息,如:
              mysqld_safe --defaults-file=/tmp/mysql.txt &
        3、如果命令行中设置了和配置文件中相同的参数,最终会以命令行为准,如:
             mysqld_safe --log-error=/var/log/mysql.log --socket=/tmp/mysql.sock --port=3310 & 
七、MySQL多实例(实例:mysqld+后台线程+预分配的内存结构)
   1、多套独立的目录(日志、socket)
        mkdir -p /data/330{7,8,9}
        chown -R mysql.mysql /data/330*
   2、独立的数据(初始化多次)
        /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307 --user=mysql
       /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3308 --user=mysql
      /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/data/3309 --user=mysql
3、独立的端口(3307、3308、3309)
   4、独立的配置文件(/data/3307/my.cnf /data/3308/my.cnf /data/3309/my.cnf )
        [root@db02 3309]# cat /data/3307/my.cnf /data/3308/my.cnf  /data/3309/my.cnf 
[mysqld] basedir=/application/mysql datadir=/data/3307 socket=/data/3307/mysql.sock log-error=/data/3307/mysql.log log_bin=/data/3307/mysql-bin binlog_format=row skip_name_resolve=1 server_id=3307 port=3307 [mysqld] basedir=/application/mysql datadir=/data/3308 socket=/data/3308/mysql.sock log-error=/data/3308/mysql.log log_bin=/data/3308/mysql-bin binlog_format=row skip_name_resolve=1 server_id=3308 port=3308 [mysqld] basedir=/application/mysql datadir=/data/3309 socket=/data/3309/mysql.sock log-error=/data/3309/mysql.log log_bin=/data/3309/mysql-bin binlog_format=row skip_name_resolve=1 server_id=3309 port=3309
   5、启动多实例
        mysqld_safe --defaults-file=/data/3307/my.cnf &
        mysqld_safe --defaults-file=/data/3308/my.cnf &
        mysqld_safe --defaults-file=/data/3309/my.cnf &
        netstat -lnp|grep 330
八、常用命令
mysql -u 用户名 -p 密码 -h mysql,IP地址 -S 套接字文件 -P 端口 -D 数据库 -e 非交互式访问数据库并执行命令 --batch或-B 以不带表头的表格形式显示结果 --skip-column-names或-N 不显示列名 # JSON_OBJECT()函数将列转换为JSON格式,GROUP_CONCAT()函数将一列数据转换为一行,参数SEPARATOR指定分隔符 mysql -uroot -p123456 -P3306 -B -e "use database;select json_object('key1', GROUP_CONCAT(DISTINCT column1 SEPARATOR ','), 'key2', column2) from tablename;" --skip-column-names # 关闭mysql mysqladmin -uroot -p123456 shutdown # 设置登陆密码 mysqladmin -uroot -p password 123456 # 查询mysql中的用户(mysql用户由用户名@'主机域'组成) select user,host from mysql.user; # 删除没有设置密码的账户 drop user ''@'db01'; drop user ''@'localhost'; drop user 'root'@'db01'; drop user 'root'@'::1'; drop user 'root'@'127.0.0.1';
启动方式:mysql.server(脚本) ------> mysqld_safe(脚本) ------>mysqld(服务)
九、CentOS7安装Mysql-5.7-glibc版本
[root@localhost ~]# yum install libaio [root@localhost ~]# useradd -s /sbin/nologin -M mysql [root@localhost ~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz [root@localhost ~]# tar -xvf mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz [root@localhost ~]# mv mysql-5.7.27-linux-glibc2.12-x86_64 /usr/local/mysql [root@localhost ~]# cp /usr/local/mysql/share/english/errmsg.sys /usr/share/mysql/english/errmsg.sys [root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize 2020-09-24T15:45:36.195123Z 1 [Note] A temporary password is generated for root@localhost: kz#T?fqY,3w_ [root@localhost ~]# /usr/local/mysql/bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data [root@localhost ~]# mkdir /var/log/mariadb && touch /var/log/mariadb/mariadb.log [root@localhost ~]# vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock datadir = /usr/local/mysql/data [root@localhost ~]# vim /etc/my.cnf.d/mysql-clients.cnf [mysql] socket=/var/lib/mysql/mysql.sock [root@localhost ~]# chown -R mysql:mysql /var/log/mariadb [root@localhost ~]# chown -R mysql.mysql /var/lib/mysql [root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@localhost ~]# /etc/init.d/mysqld start [root@localhost ~]# cat /root/.mysql_secret #mysql密码找回 # Password set for user 'root@localhost' at 2020-09-24 23:47:16 pufYa2_1C=Ei
十、Mysql8.0
my8.0.cnf
/usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/data --user=mysql  #初始化Mysql,密码为空
/usr/local/mysql/bin/mysqld --verbose --help    #查看mysqld命令参数
#Mysql8.0开启远程访问 mysql> CREATE USER 'root'@'172.18.188.%' IDENTIFIED BY '123456'; mysql> GRANT ALL ON *.* TO 'root'@'172.18.188.%'; mysql> ALTER USER 'root'@'172.18.188.%' IDENTIFIED WITH mysql_native_password BY '123456'; mysql> flush privileges;
# 创建tv用户 mysql> create user tv@'172.17.0.%' identified by 'tv123'; Query OK, 0 rows affected (0.01 sec) # 授权tv用户southpark数据库下videoinfo表查询权限 mysql> GRANT select ON southpark.videoinfo TO 'tv'@'172.17.0.%'; Query OK, 0 rows affected (0.01 sec) # 授权tv用户southpark数据库下video表查询、增加、插入、更新、删除权限 mysql> GRANT select,create,insert,update,delete ON southpark.video TO 'tv'@'172.17.0.%'; Query OK, 0 rows affected (0.00 sec) # 授权对数据库下所有表的权限 mysql> GRANT select,create,insert,update,delete ON southpark.* TO 'tv'@'172.17.%.%'; Query OK, 0 rows affected (0.00 sec) # 授权对所有库,所有表的权限 mysql> GRANT select,create,insert,update,delete ON *.* TO 'tv'@'172.%.%.%'; Query OK, 0 rows affected (0.00 sec) # 刷新权限 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) # 修改密码并指定加密规则为mysql_native_password(mysql8.0之前的版本中加密规则是mysql_native_password,mysql8.0之后的加密规则是caching_sha2_password) mysql> ALTER USER 'tv'@'172.17.0.%' IDENTIFIED WITH mysql_native_password BY 'tv123'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) # 修改用户密码 mysql> alter user 'tv'@'172.17.0.%' identified by 'xxxx'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) # 回收用户权限 mysql> revoke all privileges,grant option from 'tv'@'172.17.0.%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) # 查看账户授权信息 mysql> SHOW GRANTS FOR 'tv'@'172.17.0.%' \G # 查看密码策略 mysql> SHOW VARIABLES LIKE "%password%"; # 设置为弱口令(0:只检查密码长度,1:检查长度、大小写和特殊字符) mysql> set global validate_password.policy=0; # 设置密码最小长度为1 mysql> set global validate_password.length=1;
percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm
十一、Mysql同步出错,在从库上执行
mysql> show slave status\G
mysql> stop slave;                                                      
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;      #忽略错误        
mysql> start slave;                                                      
mysql> show slave status\G
十二、CentOS7 yum安装mysql
[root@CentOS7 ~]# rpm -Uvh https://repo.mysql.com//mysql80-community-release-el7-7.noarch.rpm
[root@CentOS7 ~]# yum -y install mysql-community-server mysql-community-client
参考链接:
       https://www.52wiki.cn/Plate/Info/id/5.html   #MySQL报错
       https://www.cnblogs.com/bigbrotherer/p/7241845.html    #yum安装mysql
       https://downloads.mysql.com/archives/community/   #MySQL Community版下载
       https://www.cnblogs.com/yanjieli/p/13220153.html   #mysql8.0安装
       https://dev.mysql.com/downloads/shell/   #mysql shell
       https://blog.csdn.net/lifetragedy/article/details/105944790   #Mysql5.7优化
       https://dev.mysql.com/doc/index-archive.html   #mysql官方文档
       http://www.ttlsa.com/mysql/mysql-mysqlslap-test/      #mysql自带压测工具mysqlslap
       https://www.cnblogs.com/bibiafa/p/9407404.html       #mysql用户权限回收
       mariadb下载
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号