标签: mysql

  • MySQL 8.0 general log 设置

    操作系统版本:Ubuntu 20.10
    MySQL版本:mysql Ver 8.0.21-0ubuntu0.20.04.4
    开启 MySQL general log 步骤:
    查找 mysqld 都读取了哪些配置文件:
    /usr/sbin/mysqld –verbose –help | grep -A 1 “Default options”
    列出了3个文件
    /etc/my.cnf
    /etc/mysql/my.cnf
    ~/.my.cnf
    这些文件只有 /etc/mysql/my.cnf 有如下内容
    !includedir /etc/mysql/conf.d/
    !includedir /etc/mysql/mysql.conf.d/
    最终在文件 /etc/mysql/mysql.conf.d/mysqld.cnf 中找到
    general_log_file 和 general_log 的配置
    设定赋值:
    general_log = 1
    general_log_file = /tmp/mysql.log
    general_log_file 对应的文件 /tmp/mysql.log 必须存在
    并且此文件的所属用户是:配置文件里面的[mysqld]中user的值,默认是mysql。
    如果属主不一致,即使其他用户有权限写这个日志文件,
    general_log 还是无法开启,开启时会报 permission denied 错误。
    修改属主
    chown mysql:mysql /tmp/mysql.log
    然后保存配置文件并退出,重新启动 mysql
    systemctl restart mysql.service
    最后使用 tail -f /tmp/mysql.log 就可以实时监控log了。
    生产环境开启这个日志要谨慎!
     
    参考资料
  • ubuntu 20.04 安装 PHP/Nginx/MySQL/Redis

    视频版:

    https://www.bilibili.com/video/BV1PK4y1n74R/

    基于Ubuntu 20.04 LTS 操作系统
    部署安装PHP
    Nginx web 服务器
    MySQL 数据库
    Redis 内存服务器

    由于服务器位于远端的机房
    所以需要远程登录服务器

    如果是Linux系统
    使用自带的terminal就可以登陆
    MacOS也有自带终端
    也可以使用 iTerm2
    Windows 可以使用的软件有很多
    例如 Windows Terminal
    共享软件 SecureCRT
    开源软件PuTTY

     

    登录系统后

    查看主机的操作系统类型
    cat /etc/os-release

    如果服务器位于国内
    建议将默认的源镜像修改为国内的地址
    https://developer.aliyun.com/mirror/ubuntu
    这样下载软件包速度会比较快

    安装 php
    apt install php

    安装 PHP进程管理器 php-fpm
    apt install php7.4-fpm

    卸载 apache2
    systemctl stop apache2.service
    apt purge apache2

    安装 nginx
    apt install nginx

    安装 MySQL
    apt install mysql-server

    安装Redis
    apt install redis-server

    安装多字节字符串扩展
    apt install php7.4-mbstring

    安装 curl 扩展
    apt install php7.4-curl

    安装 MySQL 扩展
    apt install php7.4-mysql

    安装 Redis 扩展
    apt install php7.4-redis

    安装图形库扩展
    apt install php7.4-gd

    php-imagick

    到此网站运行的基础软件都安装好了
    软件的配置也都使用了默认的配置
    但这样的配置仅用于开发测试
    用于生产环境的话要配置的细节就比较多

    修改mysql root 密码
    首先输入mysql登录mysql
    然后输入
    ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘abcd12345’;
    将密码修改为 abcd12345
    使用 flush privileges
    刷新权限
    至此开发环境搭建完毕

  • phpMyAdmin管理MySQL用户

    通过命令行管理MySQL用户不是很方便,

    尤其是变更用户密码和授权的操作,

    需要输入较为复杂的命令,

    如果在机器上部署了phpMyAdmin的话,

    就可以很方便快捷地通过图形界面来操作。

    例如新增用户,删除用户,修改用户密码,数据库授权等。

    参考视频:

    https://www.bilibili.com/video/bv1CK4y177Zr

     

  • phpMyAdmin连接MySQL配置SSL证书

    视频演示:https://www.bilibili.com/video/BV1oy4y1b7yR/

    phpMyAdmin连接 localhost上的MySQL Server是通过unix socket通信的。

    phpMyAdmin连接远程MySQL服务器,如果期望加密通信数据,此时通过配置SSL来实现。

    以Ubuntu为例,MySQL 安装后默认是开启SSL的,在数据目录/var/lib/mysql下通常会有以下文件

    ca.pem

    client-cert.pem

    client-key.pem

    只需要把这3个文件复制到phpMyAdmin所在的服务器上,然后修改phpMyAdmin SSL配置即可。

    切到 phpMyAdmin 部署的根目录,复制文件libraries/config.default.php里面有关ssl的选项到根目录下的config.inc.php中。

    也就是说,在根目录文件config.inc.php中添加下面的配置

    如果根目录没有config.inc.php,应该复制config.sample.inc.php为config.inc.php

    /**
    * Use SSL for connecting to MySQL server?
    *
    * @global boolean $cfg['Servers'][$i]['ssl']
    */
    $cfg['Servers'][$i]['ssl'] = true;
    
    /**
    * Path to the key file when using SSL for connecting to the MySQL server
    *
    * @global string $cfg['Servers'][$i]['ssl_key']
    */
    $cfg['Servers'][$i]['ssl_key'] = 'path/to/client-key.pem';
    
    /**
    * Path to the cert file when using SSL for connecting to the MySQL server
    *
    * @global string $cfg['Servers'][$i]['ssl_cert']
    */
    $cfg['Servers'][$i]['ssl_cert'] = 'path/to/client-cert.pem';
    
    /**
    * Path to the CA file when using SSL for connecting to the MySQL server
    *
    * @global string $cfg['Servers'][$i]['ssl_ca']
    */
    $cfg['Servers'][$i]['ssl_ca'] = 'path/to/ca.pem';
    
    /**
    * Directory containing trusted SSL CA certificates in PEM format
    *
    * @global string $cfg['Servers'][$i]['ssl_ca_path']
    */
    $cfg['Servers'][$i]['ssl_ca_path'] = 'path/to/';
    
    /**
    * List of allowable ciphers for SSL connections to the MySQL server
    *
    * @global string $cfg['Servers'][$i]['ssl_ciphers']
    */
    $cfg['Servers'][$i]['ssl_ciphers'] = null;
    
    /**
    * MySQL 5.6 or later triggers the mysqlnd driver in PHP to validate the
    * peer_name of the SSL certifcate
    * For most self-signed certificates this is a problem. Setting this to false
    * will disable the check and allow the connection (PHP 5.6.16 or later)
    *
    * @link https://bugs.php.net/68344
    * @global string $cfg['Servers'][$i]['ssl_verify']
    */
    $cfg['Servers'][$i]['ssl_verify'] = true;

    配置中的路径为上述三个证书相关文件的实际路径。

    此时,需要确认MySQL是否允许远程连接,

    MySQL配置文件路径 /etc/mysql/mysql.conf.d/mysqld.cnf

    bind-address = 127.0.0.1

    表示只允许本地连接,应该在行首加#注释此行,

    再次,确认MySQL服务器是否允许入站端口3306 ,

    此时应该就可以安全的连接MySQL了。

     

  • phpMyAdmin免输入密码登录

    通过将MySQL的用户名和密码存储在 phpMyAdmin 的配置文件中,

    就可以快捷登录 phpMyAdmin

    免除输入密码的步骤,

    当然最好是部署在内网,

    否则将存在很大安全隐患。

    配置步骤

    1> 复制 config.sample.inc.php 为 config.inc.php

    2> 修改代码示例:

    /**
     * Second server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'config';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = 'localhost';
    $cfg['Servers'][$i]['user'] = '';
    $cfg['Servers'][$i]['password'] = '';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

    其中 auth_type 由原来的 cookie 修改为 config

    第9行和10行增加了 user 和 password 的配置

    将用户名和密码写入代码中

    在登陆界面选择服务器后点击执行

    无需填写用户名和密码就可以登录 phpMyAdmin 了

  • phpMyAdmin连接远程服务器配置

    phpMyAdmin登陆界面默认的MySQL服务器只有localhost

    如果想连接其他服务器上的MySQL

    此时只需要在config.inc.php中增加配置就可以了

    首先复制文件 config.sample.inc.php 为 config.inc.php

    然后找到下面的代码片段

     

    /**
     * First server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = 'localhost';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

    复制为

    /**
     * Second server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = '192.168.1.11';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

     

    注意第8行,新增加的数据库服务器地址为 192.168.1.11

    这样在登录界面就可以看到新增加的服务器了。

    操作视频

    https://www.bilibili.com/video/BV1Ji4y177xc/

  • 申请免费AWS关系数据库RDS

    亚马逊AWS(Amazon Web Services )免费提供关系数据库RDS服务,共计12个月每月750小时,但仅限较低配置和部分可用区。对于小规模开发测试是项不错的福利。

    相较自行搭建数据库服务,云数据库具有诸多优点,如更好的稳定性、自由扩展、多区域服务,灾备机制等,省去了许多运维工作。

    申请过程:https://www.bilibili.com/video/BV14v41167DZ/

  • PHP连接MySQL数据库

     PHP为什么要连接数据库呢?

    如果首次接触PHP,会有这样的疑问。

    当然,也可以不连接数据库,PHP程序也可以正常运行。

    PHP程序代码,只负责业务逻辑的处理,对于输入的数据进行计算并输出结果。

    比如,你给一段计算和值的代码输入1,2….10,程序计算完并返回结果55。

    此时,如果想把这个计算过程中,输入数据和输出数据存储下来,就需要数据库了。

    PHP可以连接哪些数据库?

    只要数据库和程序之间有相应的统一接口,就可以连接,常见的MySQL, PostgreSQL,SQL Server,Oracle,MongoDB,Redis都可以连接,其中以MySQL使用最为广泛。

    PHP程序如何与MySQL数据库交互?

    PHP与MySQL是互相独立的软件,两者若要进行数据交互,

    就必须相互暴露相关的API,这些API通常是基于各自源码开发的扩展程序。

    PHP与数据库进行数据交互,主要有以下三种扩展:

    1) mysql扩展

    2) mysqli扩展

    3) PDO_MYSQL扩展

    上面3种扩展都是基于PHP核心代码编写的扩展库, 都有对应的库函数和类。

    上面3种扩展连接数据库服务器,可以使用以下2种数据库驱动:

    1. MySQL Client Library [ libmysql ]
    2. MySQL Native Driver  [mysqlnd ]

    注意,这两个库是底层的,直接和数据库服务器交互的,没有提供PHP代码编程接口,是安装PHP的时候就指定的。

    php扩展-libmysql关系图[1]

    注意:

    自PHP5.4.x,默认的驱动由libmysql变为mysqlnd,自PHP 5.5.0 libmysql被废弃,自PHP 7.0.0 libmysql开始被移除,这是因为mysqlnd是由PHP官方发布的新一代驱动程序,之前的libmysql的由MySQL AB发布,从而规避了版权问题,这只是一方面的原因,mysqlnd是直接集成在PHP源码中的,使用PHP的内存管理系统,支持PHP的内存限制,比libmysql有更快执行速度和更少的内存使用率。

    PHP mysqlnd数据库驱动结构图

    php mysqlnd结构图[2]
     

    mysqlnd和libmysql在内存占用上的对比:

    limysql和mysqlnd在内存占用上的对比[3]
     

    可以看到,libmysql查询的数据在内存中存储了2份,而mysqlnd只存储了一份。

    使用mysqlnd,运行PHP的主机可以不用安装数据库,而之前使用libmysql这是必须的。

    mysqlnd还有更多特性,例如,增强的持续连接,SSL支持等,所以是时候抛弃libmysql了。

    PHP连接MySQL数据库代码示例:

    <?php
    // mysqli
    $mysqli = new mysqli("example.com", "user", "password", "database");
    $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $result->fetch_assoc();
    echo htmlentities($row['_message']);
    
    // PDO
    $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
    $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $statement->fetch(PDO::FETCH_ASSOC);
    echo htmlentities($row['_message']);
    
    // mysql
    $c = mysql_connect("example.com", "user", "password");
    mysql_select_db("database");
    $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = mysql_fetch_assoc($result);
    echo htmlentities($row['_message']);
    ?>
    • mysqli扩展提供了丰富的面向对象编程模式来操作数据库的方式,比只支持函数式编程的mysql扩展好很多。
    • PDO方式虽然在编程上稍复杂一点,程序效率稍慢点,但是当业务的数据库类型变化时,基本上不用修改代码,因为它为各个不同的数据库定义了一个统一的接口。
    • mysql_connect方式的连接已经淘汰了。

    参考资料
    [1] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [2] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [3] Andrey Hristov <andrey@mysql.com>