标签: mysql
-
MySQL 8.0 general log 设置
操作系统版本:Ubuntu 20.10MySQL版本: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 = 1general_log_file = /tmp/mysql.loggeneral_log_file 对应的文件 /tmp/mysql.log 必须存在并且此文件的所属用户是:配置文件里面的[mysqld]中user的值,默认是mysql。如果属主不一致,即使其他用户有权限写这个日志文件,general_log 还是无法开启,开启时会报 permission denied 错误。修改属主chown mysql:mysql /tmp/mysql.log然后保存配置文件并退出,重新启动 mysqlsystemctl 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-gdphp-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
这样在登录界面就可以看到新增加的服务器了。

操作视频
-
申请免费AWS关系数据库RDS
亚马逊AWS(Amazon Web Services )免费提供关系数据库RDS服务,共计12个月每月750小时,但仅限较低配置和部分可用区。对于小规模开发测试是项不错的福利。
相较自行搭建数据库服务,云数据库具有诸多优点,如更好的稳定性、自由扩展、多区域服务,灾备机制等,省去了许多运维工作。
-
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种数据库驱动:
- MySQL Client Library [ libmysql ]
- 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>