本程序配置mysql地址为127,且mysql绑定到127时,本程序报2002错误,但是写个php文件测试mysql是能正常连接并查询的,或者当mysql不绑定127(即绑定到0.0.0.0时),本程序可正常使用
Weltolk opened this issue · comments
- 我已升级贴吧云签到到最新版本,并且运行了升级脚本
- 我已搜索过 Issue 区,没有找到相关问题
问题描述
config.php配置的mysql地址为127:
1.当mysql不绑定到127,也就是绑定到0.0.0.0时,本程序可以正常使用
2.当mysql绑定到127时,本程序报2002错误
3.当mysql绑定到127时,写个php文件测试mysql是可以正常连接和查询的
复现步骤
config.php:
<?php
//特别警告:禁止使用记事本编辑!
////////////////////////////以下选项只需在使用MySQL时填写////////////////////////////
//MySQL 数据库地址,普通主机一般为localhost
define('DB_HOST','127.0.0.7:3306');
//MySQL 数据库用户名
define('DB_USER','root');
//MySQL 数据库密码
define('DB_PASSWD','root');
//MySQL 数据库名称
define('DB_NAME','tiebacloud');
////////////////////////////以下选项使用任何数据库都需填写////////////////////////////
//数据库前缀,建议保持默认
define('DB_PREFIX','tc_');
///////////////////////////////////////其他设置///////////////////////////////////////
//停用CSRF防御
//说明在 http://git.oschina.net/kenvix/Tieba-Cloud-Sign/wikis/关于云签到CSRF防御
define('ANTI_CSRF',true);
//加密用盐,留空为不使用
define('SYSTEM_SALT','');
连接测试php文件:
root@VM-0-7-debian:/var/www/tieba# cat a.php && php a.php
<?php
$conn = mysqli_connect("127.0.0.1","root","root","tiebacloud");
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功\n";
$result=mysqli_query($conn,"select * from tc_users");
while ($row = mysqli_fetch_assoc($result)) {
print_r($row);
}
mysqli_close($conn);
?>
连接成功
Array
(
[id] => 1
[name] => adm
[pw] => xxxxxxxxxxxxxxxxxxxxxxxxx
[email] => gmail@gmail.com
[role] => adm
[t] => tieba
)
root@VM-0-7-debian:/var/www/tieba#
mysql配置文件my.cnf:
[mysqld]
performance_schema_max_table_instances=400 #影响不大
table_definition_cache=400 #最小400,对内存占用影响大
table_open_cache=500 #影响不大
secure_file_priv=NULL
bind-address=127.0.0.1
mysqlx-bind-address=127.0.0.1
环境
- 云签到版本:023316e(物理机通过git clone安装)
- 服务器系统和版本:
Linux VM-0-7-debian 5.10.0-17-amd64 #1 SMP Debian 5.10.136-1 (2022-08-13) x86_64 GNU/Linux
- 云签到是否在 Docker 中运行:
Flase
- PHP 版本:
PHP 7.4.30 (cli) (built: Jul 7 2022 15:51:43) ( NTS )
- MySQL 版本:
mysql Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
define('DB_HOST','127.0.0.7:3306');
请确定不是 127.0.0.1
或者 localhost
?
define('DB_HOST','127.0.0.7:3306');
请确定不是
127.0.0.1
或者localhost
?
1.127无法连,localhost可连,localhost:3306能连,可以问一下是什么原因吗?
2.另外请问如果是填ip,那么怎么配置端口呢(在示例config.php里未找到)?是'DB_PORT'吗?
3.请问config.php的全部配置项有文档或者示例吗?
mysql配置文件my.cnf:
[mysqld]
performance_schema_max_table_instances=400 #影响不大
table_definition_cache=400 #最小400,对内存占用影响大
table_open_cache=500 #影响不大
secure_file_priv=NULL
bind-address=127.0.0.1
mysqlx-bind-address=127.0.0.1
根据其文档:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
可以存储在表定义缓存中的表定义数。如果你使用大量的表,你可以创建一个大的表定义缓存来加速表的打开。与普通的表缓存不同,表定义缓存占用更少的空间并且不使用文件描述符。最小值为 400。默认值基于以下公式,上限为 2000:
MIN(400 + table_open_cache / 2, 2000)
对于InnoDB,该 table_definition_cache 设置充当对字典对象缓存中的表实例数量和一次可以打开的每表文件表空间数量的软限制。如果字典对象缓存中的表实例数量超过 table_definition_cache限制,LRU 机制开始将表实例标记为逐出,并最终将它们从字典对象缓存中删除。table_definition_cache由于具有外键关系的表实例未放在 LRU 列表中,因此 具有缓存元数据的打开表的数量可能高于 限制。
一次可以打开的 file-per-table 表空间的数量受 table_definition_cache和 innodb_open_files设置的限制。如果设置了两个变量,则使用最高设置。如果两个变量都没有设置 table_definition_cache ,则使用具有更高默认值的设置。如果打开的表空间的数量超过 table_definition_cacheor 定义的限制innodb_open_files,LRU 机制会在 LRU 列表中搜索已完全刷新且当前未扩展的表空间文件。每次打开新表空间时都会执行此过程。只有不活动的表空间被关闭。
表定义缓存与字典对象缓存 的表定义缓存分区并行存在 。两个缓存都存储表定义,但服务于 MySQL 服务器的不同部分。一个缓存中的对象不依赖于另一个缓存中对象的存在。有关更多信息,请参阅 第 14.4 节,“字典对象缓存”。
我的评价是如果您需要节省mysql所吃的内存您不如去调整innodb_buffer_pool_size和redologsize
bind-address=127.0.0.1
mysqlx-bind-address=127.0.0.1
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_bind_address
服务器处理不同类型的地址如下:
如果地址为*,则服务器在所有服务器主机 IPv4 接口上接受 TCP/IP 连接,如果服务器主机支持 IPv6,则在所有 IPv6 接口上接受 TCP/IP 连接。使用此地址可允许所有服务器接口上的 IPv4 和 IPv6 连接。此值为默认值。如果变量指定了多个值的列表,则不允许使用此值。
如果地址是0.0.0.0,则服务器接受所有服务器主机 IPv4 接口上的 TCP/IP 连接。如果变量指定了多个值的列表,则不允许使用此值。
如果地址是::,则服务器接受所有服务器主机 IPv4 和 IPv6 接口上的 TCP/IP 连接。如果变量指定了多个值的列表,则不允许使用此值。
如果地址是 IPv4 映射地址,则服务器接受该地址的 TCP/IP 连接,采用 IPv4 或 IPv6 格式。例如,如果服务器绑定到::ffff:127.0.0.1,客户端可以使用--host=127.0.0.1或 进行连接--host=::ffff:127.0.0.1。
如果地址是“常规” IPv4 或 IPv6 地址(例如127.0.0.1或 ::1),则服务器仅接受该 IPv4 或 IPv6 地址的 TCP/IP 连接。
https://dev.mysql.com/doc/refman/8.0/en/x-plugin-options-system-variables.html#sysvar_mysqlx_bind_address
根据 https://www.percona.com/blog/2019/01/07/understanding-mysql-x-all-flavors/ ,tc并不使用mysqlx协议来与mysql服务端通讯,因此这个变量的值与问题无关
define('DB_HOST','127.0.0.7:3306');
请确定不是
127.0.0.1
或者localhost
?1.127无法连,localhost可连,localhost:3306能连,可以问一下是什么原因吗?
2.另外请问如果是填ip,那么怎么配置端口呢(在示例config.php里未找到)?是'DB_PORT'吗?
3.请问config.php的全部配置项有文档或者示例吗?
- 建议
cat /etc/hosts
看看您的localhost是不是没解析为127.0.0.1
而是127.0.0.7
- 根据
Tieba-Cloud-Sign/lib/mysql_autoload.php
Line 25 in c0a58bd
127.0.0.1:3306
- 没有
define('DB_HOST','127.0.0.7:3306');
请确定不是
127.0.0.1
或者localhost
?1.127无法连,localhost可连,localhost:3306能连,可以问一下是什么原因吗?
2.另外请问如果是填ip,那么怎么配置端口呢(在示例config.php里未找到)?是'DB_PORT'吗?
3.请问config.php的全部配置项有文档或者示例吗?
- 建议
cat /etc/hosts
看看您的localhost是不是没解析为127.0.0.1
而是127.0.0.7
- 根据
Tieba-Cloud-Sign/lib/mysql_autoload.php
Line 25 in c0a58bd
应该是直接写在DB_HOST里,如127.0.0.1:3306
- 没有
感谢这么详细的解答,已解决