我正在运行 MariaDB Windows Server 2022 Standard
,并且系统磁盘上的磁盘空间不足。
我在以下路径中找到一个名为ib534F.tmp
65 GB 的文件,与 MariaDB 相关:
C:\Windows\ServiceProfiles\MariaDB_PROJECT\AppData\Local\Temp
根据 Windows,该文件最后一次编辑是在 2022 年 10 月 4 日,但我不确定这是否属实。
删除此文件安全吗?
最坏的情况是什么?
我在 Rhel Linux 上有一个 MariaDB 10.6 服务器,我想为表创建一个触发器。这是我的代码:
DELIMITER //
CREATE TRIGGER before_salary_update
BEFORE UPDATE ON Employee
FOR EACH ROW
BEGIN
DECLARE salary_change DECIMAL(10, 2);
-- Calculate the percentage change in salary
SET salary_change = (NEW.salary - OLD.salary) / OLD.salary * 100;
-- Check if the change is within the 10% threshold
IF salary_change > 10 OR salary_change < -10 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Error: Salary change exceeds 10% limit.';
END IF;
END //
DELIMITER ;
当我使用分隔符运行代码时,我的终端会冻结,我必须使用 ctrl+c 来中断它。当我不使用分隔符执行它时,我收到此错误:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
我也尝试将其复制到 sql 文件中并从操作系统执行它。但我遇到了同样的问题。
我正在使用 Galera 复制和 MaxScale 读写器路由器。
我遇到一个问题,因为应用程序是按照这个流程开发的:
结果是使用写入服务器更新记录,下一次读取在读取服务器上完成。由于复制延迟,它无法获取刚刚更新的数据。
不幸的是,重新考虑整个应用程序有点困难,我正在寻找是否存在某种解决方案来强制在写入服务器中进行读取,这样我就可以确保获取刚刚更新的数据。
我设置了一个 mariadb 数据库来记录实验数据。在其中一个表中,我每行都存储了巨大的原始图像。由于每行包含 3 张 512*512px 图像,几百万行数据已经耗尽了磁盘空间。我有 12TB 的磁盘,数据库已经占用了约 10TB。图像之间的差异很小,所以我相信有很大的压缩空间。我想考虑压缩数据库,但由于可用空间有限,我想要一种方法来就地压缩它。我在 Ubuntu 20.04 上使用 mariadb 10.3.39。我不是数据库专家,但我很乐意学习更多。我试过:
ALTER TABLE images ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 ALGORITHM=INPLACE;
我得到了:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ALGORITHM=INPLACE' at line 1
我还考虑过是否可以将表分成多个块,然后单独压缩每个分区。但是我也不确定对现有表进行分区是否需要更多空间。在盲目尝试之前,我想得到一些建议。
我有一张表格,里面有我们从各种来源收集的数据。它有项目名称、来源和来源值。
该表如下所示:
ID | 姓名 | 来源 | 价值 |
---|---|---|---|
1 | 美国广播公司 | 网络 | 1 |
2 | 美国广播公司 | 打印 | 2 |
3 | 坐标 | 打印 | 8 |
4 | 坐标 | 网络 | 9 |
使用该JSON_OBJECTAGG()
函数,我可以根据名称将源分组在一起:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
这正确给出了:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2} |
坐标 | {"打印":8, "网页":9} |
现在,我想运行该查询,但使用价格/来源的过滤器,因此我运行了以下查询:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
这似乎有效,但是有一个小问题:
姓名 | 数据 |
---|---|
美国广播公司 | {"网页":1, "打印":2}} |
}
为什么JSON 数据的末尾突然多了一个多余的内容?该HAVING
子句正确地筛选了行,但为什么它会修改结果数据?
在线演示:https ://sqlfiddle.com/mariadb/online-compiler?id=ccf1041c-3ada-4fc9-bd77-2b0fe1428392
我不确定该网站使用哪个版本的 MariaDB,但在我的本地计算机上使用 MariaDB 10.11.9 进行测试得出相同的结果。
编辑:看来我可以通过以下方法解决这个问题:
SELECT name, JSON_OBJECTAGG(source, value) AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(JSON_OBJECTAGG(source, value), 2, '$.print')
我只是想避免JSON_OBJECTAGG()
多次写入。此外,虽然这解决了问题,但我仍然很好奇为什么这首先是一个问题。
编辑 2:另一个“修复”是用JSON_OBJECTAGG()
替换GROUP_CONCAT()
。
以下返回正确的数据:
SELECT name,
REPLACE(GROUP_CONCAT(JSON_OBJECT(source, value)), '},{', ',') AS data
FROM testStuff
GROUP BY name
HAVING JSON_CONTAINS(data, 2, '$.print')
我的表中有两个布尔列。一个叫做 IsUnlisted,另一个叫做 IsPrivate。如果 IsUnlisted 也为 1 (TRUE),我只想使用检查约束允许 IsPrivate 为 1 (TRUE)。我使用的是 MariaDB,它与 mysql 共享大多数功能。
SHOW VARIABLES LIKE 'general_log%';
+------------------+------------------+
| Variable_name | Value |
+------------------+------------------+
| general_log | ON |
| general_log_file | ff3b5fbeb27b.log |
+------------------+------------------+
在哪里可以找到这个ff3b5fbeb27b.log
文件?
https://dev.mysql.com/doc/refman/8.4/en/query-log.html文档没有提及它应该驻留的任何路径,并且我的搜索告诉我它位于 下/var/log/mysql/
,但不适用于我的情况:
]> system ls -l /var/log/mysql/
total 0
FTA,我的mysql来自最新的docker镜像:mariadb:10.5:
$ mysql -V
mysql Ver 15.1 Distrib 10.5.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
$ uname -rm
6.8.0-1010-azure x86_64
我已经通过以下方式安装了 MariaDB brew
,每次重启计算机时,我都需要通过以下方式手动启动它:
brew services start [email protected]
此外,我在“设置”>“常规”中的“登录项”中找不到列出的 mariadb
如何让 mariadb 出现在“登录项”中?
先感谢您。
我有三个客户,他们都使用 MariaDB 作为他们的应用程序。
为了安全起见,我为每个虚拟机创建了一个具有 2vCPU 和 4GB RAM 的虚拟机。
但我在想合并他们的服务器是否是个坏主意,因为他们将受益于更强大的服务器,而且我的云费用也会少一些。
电力与安全性方面的优势有哪些?
我一直在阅读 MariaDB 手册和教程,显然这应该有效:
EXPLAIN CREATE TABLE `prefix_database2`.`table1` LIKE `prefix_database1`.`table1`;`
该LIKE
运算符应该复制表的列和键。我不知道为什么会出现语法错误。
如何从第一个数据库复制第二个数据库中的表,同时保持完全相同的列、键等?