我在 stackoverflow 上问了这个问题,并被指示在这里问这个问题。
我有几个运行 MySQL 查询的 PHP 脚本。有时,它们会导致服务器卡住或被 MySQL 进程阻塞,这些进程需要一段时间,例如格式错误LEFT JOINs等。
当我运行查询以查找有关已运行的所有当前 MySQL 查询的信息时,是否可以将查询 ID 解析为运行它的文件?
有一个查询一直在休眠 3973 没有关于这个查询的信息,所以我试图找到尽可能多的信息?
这是我关于 DBA 的第一篇文章。我想从你那里得到一些明确的想法。首先,这听起来像是讨论,但它不是辩论。我正在寻找的可能是“是的,他们可以为所欲为”或“不,不可能!”
最近我完成了一个web应用程序的开发。完成后,我被告知联系服务器区域部门,以便他们可以帮助我上传我的 SQL 数据库、授予权限等。
所以,我这样做了。他们解释了他们是如何工作的,我们同意上传一个非操作版本的数据库,所以我们可以测试权限等。他们告诉我为他们处理数据库的备份。他们会恢复它。第一件事就是在我心里制造噪音。我不应该是恢复备份的人吗?“嗯……我还不是 dba,我相信他们更清楚。” 是我对自己的回答,因为这些可能是他们的做法。
两天后,他们给我发了一封电子邮件,说备份已启动并提供了一些建议。他们需要对我的数据库表进行规范化并拥有正确的索引。
我的反应并不甜蜜。首先,我们都讨论过它,备份不是操作性的......那么,有任何相关结论吗?......顺便说一下,表格都完全规范化了。其次,他们可以进入那么深吗?如果我的数据库中包含的信息很关键怎么办?
非常感谢,希望对这个问题有一些见解。
在 MySQL 中,我有一个表(针对这个问题进行了简化)
CREATE TABLE `projects` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`priority` int(11) DEFAULT '1000000',
`status` enum('new','in_progress','complete') DEFAULT 'new',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
我想从按优先级排序的表中进行选择,但将状态为“完成”的行排在最后。
这有效:
SELECT * FROM projects
order by
case
when status='complete' then 999999
when status!='complete' then priority
end ASC
Run Code Online (Sandbox Code Playgroud)
但是将 999999 更改为 (select max(priority)+1 from projects) 会产生意想不到的结果,出现状态=完成的结果行第一页的一半。
此外,最后一种方法可能会导致重复计算相同的值。
做这个的最好方式是什么?
我们有一个在 Windows Server 2008 R2 x64(服务器 A)上运行的 MySQL 5.1 实例复制到 Windows Server 2003 R2(服务器 B)上的另一个 MySQL 5.1 实例。
我们在另一台 Windows Server 2008 R2 x64 机器(服务器 C)上有一个新的 MySQL 5.5 实例。
我想用服务器 C 替换服务器 A。
我的计划是通过像这样“克隆”服务器 B 将服务器 C 设置为服务器 A 的另一个从站:
http://www.redips.net/mysql/add-new-slave/。
之后我打算这样做:
http://blesseddlo.wordpress.com/2011/06/03/convert-mysql-slave-to-master/。
之后我想将服务器 B 的主服务器更改为服务器 C。
这是一种可行的方法吗?有注意事项吗?将 MySQL 5.5 实例设置为 MySQL 5.1 实例的从属时,是否存在兼容性问题?
我不能只是停止一切并使用,mysqldump因为不会有停机时间,而且我们有大约 25 GB 的数据必须通过千兆 LAN 传输。
我们使用一家大公司作为我们的服务提供商。
那家服务公司的技术人员正在非常努力地安装一种叫做 的东西Avamar SQL Agent,据称它将用于替换我旧的可靠的完整、差异和事务日志备份。有人告诉我,它会不断监视 mdf、ndf 和 ldf 文件的任何更改,然后将更改的项目(页面、???)写入某处 (???)。
一旦新技术得到证实,我就完全支持新技术,但我对这种方法持怀疑态度,即我将不再需要采用 SQL Server 本地压缩备份(同样是完整、差异和 tlog)。
到目前为止,我已经采取的立场是,除非并且直到他们能够通过测试向我证明它不会弄乱我的 mdf、ndf 和 ldf 文件并且仍然可以恢复,否则我不会祝福这次冒险。在这里,我不知道什么或谁会做恢复本身……它是 SQL Server 恢复的某种派生,一些 Avamar 恢复,某种组合等。
有没有人对这个产品有任何经验?
下面的选择返回我所有用户拥有的所有项目的数组。
WITH user_projects AS
(SELECT
u.id as user_id
,COALESCE(array_agg(DISTINCT pa.project_id), '{0}'::integer[]) as project_ids
FROM users u
LEFT JOIN project_assignments pa on pa.user_creator_id = u.id
GROUP BY u.id
)
user: 1, project_ids: {1, 2}
user: 2, project_ids: {3, 4}
Run Code Online (Sandbox Code Playgroud)
使用该选择,我想进行报告,该报告将为每个用户显示 12 个月的摘要。
SELECT
to_char(pk.created_at,'Mon') as mon
,extract(year from pk.created_at) as yyyy
,up.user_id
,COALESCE(count(distinct pk.keyword_id), 0) as total_keywords
FROM user_projects up
LEFT JOIN project_keywords pk on pk.project_id = ANY(up.project_ids::int[])
GROUP BY up.user_id, up.project_ids, 1, 2
Run Code Online (Sandbox Code Playgroud)
输出:
mon: sept, yyyy: 2014, user_id: 1, …Run Code Online (Sandbox Code Playgroud) 我在服务器上有很多 SQL Server 作业。每当完成任何作业执行时,我都需要执行 SP。一种困难的方法是在每个调用该 SP 的作业上创建一个步骤。
有没有简单的方法可以做到这一点?作业完成后,SQL Server 是否执行任何 SP 或任何内容?
我想将一张表合并到另一张表中。我需要在我的 WHEN MATCHED 子句中应用条件逻辑,理想情况下这样做:
MERGE INTO ATable AS a
USING BTable AS b
ON a.ID = b.ID
WHEN NOT MATCHED THEN
-- Do insert
WHEN MATCHED AND b.NeedsAdjustment = 1 THEN
UPDATE SET
Col1 = b.Col1 + b.Adjustment
,Col2 = b.Col2 + b.Adjustment
,Col3 = b.Col3 + b.Adjustment
WHEN MATCHED THEN -- Default case (b.NeedsAdjustment <> 1)
UPDATE SET
Col1 = b.Col1
,Col2 = b.Col2
,Col3 = b.Col3
Run Code Online (Sandbox Code Playgroud)
这不是有效的 SQL。根据 MSDN 文档:
如果有两个 WHEN MATCHED 子句,则一个必须指定 UPDATE 操作,一个必须指定 DELETE 操作。 …
我有一个查询,我在其中进行了一些计算,然后为该列指定了别名。在下一列中,我想在 IF 语句中使用该计算的结果。当我将别名用作条件时,MySQL 无法识别它,而是要求我重写整个查询,在它周围放置一些括号,然后执行条件检查。
这是 SQL 查询:
SELECT StudentId
,SubjectID
, (COUNT(StudentId) / (
SELECT COUNT(SubjectID)
FROM lectureattendancein
WHERE SubjectID ='MIS4' ) * 100) AS Percentage
, IF((COUNT(StudentId) / (
SELECT COUNT(SubjectID)
FROM lectureattendancein
WHERE SubjectID ='MIS4'
)* 100) >= 80, 'ALLOWED', 'NOT ALLOWED') AS ExamAdmit
FROM attendancein
GROUP BY StudentId, SubjectID
HAVING SubjectID='MIS4'
ORDER BY StudentId ASC
Run Code Online (Sandbox Code Playgroud)
我想在 IF 语句中使用名为Percentage的列别名
我有一个日期数组,我想知道数组中的任何元素是否出现在给定的日期范围内。
例如(伪代码 - 不起作用,为了可读性而包装):
SELECT ARRAY['2017-01-01'::DATE, '2017-02-03'::DATE] &&
daterange('2017-01-01', '2017-01-31', '[]');
Run Code Online (Sandbox Code Playgroud)
这个例子试图展示(虽然它不起作用)是我的日期数组和日期范围之间的值之间是否存在重叠。
理想情况下,我可以用集合来做,并确定两者之间是否存在联合,但似乎不可能将 daterange 对象转换为任何东西。
我确实设法让这个工作,但我不知道如何随后减少行:
SELECT daterange('2017-01-01', '2017-01-31', '[]') @>
unnest(ARRAY ['2017-01-01' :: DATE, '2016-07-30' :: DATE]);
Run Code Online (Sandbox Code Playgroud)
这将返回多行:
?column?
----------
t
f
(2 rows)
Run Code Online (Sandbox Code Playgroud)
有没有人对此有任何指示?任何帮助表示赞赏。
mysql ×4
sql-server ×4
postgresql ×2
alias ×1
array ×1
backup ×1
join ×1
merge ×1
migration ×1
mysql-5.1 ×1
mysql-5.5 ×1
order-by ×1
range-types ×1
update ×1
windows ×1