如何在不停机的情况下对实时数据库进行架构更改?
例如,假设我有一个 PostgreSQL 数据库,其中包含一个包含各种用户数据(如电子邮件地址等)的表,所有这些数据都与特定用户相关联。如果我想将电子邮件地址移动到一个新的专用表,我必须更改架构,然后将电子邮件数据迁移到新表。如何在不停止写入原始表的情况下完成此操作?当然,当数据从旧表写入新表时,新数据会继续写入旧表而被遗漏,对吗?
我想这个问题经常出现,但我找不到任何标准的解决方案来处理它。
这篇文章解决了这个问题,但我并没有真正理解第3步。他说要写入两个表,然后将旧数据从第一个表迁移到新表。您如何确保只迁移旧数据?
(我在 Heroku 上使用PostgreSQL。)
我们碰巧使用的是 SQL Server 2012 标准版。我还碰巧使用了 Ola Hallengren 的脚本来提供一个简单、更灵活的框架来进行备份和维护。
这个问题不是关于 Ola 的脚本,而是关于最佳实践。我意识到最终的答案是“这取决于贵公司的要求”。但我正在尝试就如何最好地满足我对公司要求的理解寻求社区的建议。
我希望每 15 分钟设置一次事务日志备份。这样我们希望丢失不超过 15 分钟的数据。我应该设置一项使用 ALL_DATABASES 的作业吗?还是为每个数据库设置一项工作并并行启动它们更好?我问,因为根据我如何看待 Ola 的脚本功能,我有一种感觉,即备份是串行启动的。串行的缺点是每个连续的备份都等待另一个完成。这可能会增加备份之间的时间量(即大于 15 分钟)。另外,我担心一个备份的失败会阻止其他备份的发生,我不希望出现这种情况。我希望其他人继续备份。
那么,Ola 的脚本是串行执行的,而且故障也会停止连续备份吗?
每个数据库都有一份工作是不是更好?还是做所有事情的单一工作?我倾向于单独的工作,但我希望了解 SQL Server DBA 通常倾向于做什么。
我有一台装有 Windows XP Professional Edition Service Pack 3 操作系统的笔记本电脑作为我的开发人员站。
我已经下载并安装了 Express-C 版本的 IBM DB2 UDB 9.7 修订包 4。
我有一个名为 db2admin 的本地 Windows 帐户,我将它用作本地数据库管理员,用于本地安装 DB2(仅限开发人员)。
运行命令行窗口时,我可以毫无问题地运行以下命令:
db2 attach to db2 user db2admin using xxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
这允许我附加到我的名为 DB2 的实例。
我可以运行我的创建数据库命令。
然后我尝试连接到数据库以授予我在 DB2 中的 db2admin 帐户的所有权限。
db2 CONNECT TO MYDB;
SET SCHEMA DB2ADMIN;
db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,IMPLICIT_SCHEMA,LOAD,CREATE_EXTERNAL_ROUTINE,QUIESCE_CONNECT,SECADM ON DATABASE TO USER DB2ADMIN;
CONNECT RESET;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,DB2 告诉我我的实际 Windows 用户帐户 (synprgcma) 无权向用户 db2admin 授予权限。
因此,如果我将第二个脚本更改为以下内容:
db2 CONNECT TO MYDB USER db2admin USING xxxxxxxx;
SET SCHEMA DB2ADMIN;
db2 …
Run Code Online (Sandbox Code Playgroud) 我最近从 Java 开发人员过渡到我们公司的实际 DBA。可以这么说,我正在学习如何成为一名 DBA(这对我们公司来说实际上是一个新职位)。
我已经看到了几个我们运行命令的脚本DB2 BIND bind_file other_parameters
。
我对这些做什么感到困惑。我问过我们的其他 DBA,但他们无法以合理的方式向我解释。我已经查看了IBM 信息中心的 BIND 命令,但我也不清楚。
我知道绑定在某种程度上很重要,因为我们应该定期在我们的数据库上运行 REORGS、运行 STATS 和重新 BIND 以帮助提高性能。
由于我仍然是 n00b DBA,我想知道是否有人可以提供“傻瓜绑定是什么?” 解释?
编辑:在以下答案的版本中,我最近遇到了以下 developerworks 文章:“DB2 包:概念、示例和常见问题:了解 DB2 系统和用户应用程序包”。很有帮助。特别是对于系统包,这是我们最常遇到的。
20130905 编辑:DB2 DBA Ember Crooks 的这篇博客条目在绑定及其含义方面非常出色。她还写了一篇关于未找到包以及何时为绑定增加 CLIPKG 编号以及这意味着什么的条目。这些文章解释得很好。如果存在这样的东西,基本上就像阅读“DB2 Binding and Packages for Dummies”一样。
我和我们公司的另一位 DBA 的任务是审查供应商为我们开发的数据库设计。供应商表示他们使用 Kimball 作为其设计的基础。(注意:我不是在寻找 Kimball 与 Inmon 等的论点。)他们设计了一个具有多个事实和维度的集市。
现在平心而论,我们公司从来没有设计过一个单一的市场。我们一直让顾问这样做。我们从来没有被派去上课或做任何事情。所以我们对仓储/集市/维度建模等的知识是基于我们所拥有的一点经验,我们可以在互联网上找到的内容,以及自读(我们有 Inmon 和 Kimball 的书,并正在努力通过它们) .
既然已经为我的知识水平设置了舞台,我们就来到了设计挑战。
有一个名为“索赔损失统计”的事实表(用于保险)。他们试图同时获取索赔的付款(累计到每月的水平),然后是准备金中的资金(有点像索赔的银行账户)。他们希望看到每月的付款金额(没什么大不了的)。但他们希望看到准备金的账户当前余额。
我举一个形象的例子。
假设我们为索赔设置了 1000 美元的准备金。这被搁置了(所以在某些方面它的功能有点像银行账户)。
2014 年 10 月,我们尚未支付任何款项。因此,企业希望查看 10 月底的付款和准备金余额。
-----------------------------------------------
- MONTH_YEAR - PAYMENTS - RESERVE_BALANCE -
-----------------------------------------------
- 102014 - 0.00 - 1000.00 -
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
然后十一月来了。我们支付 100 美元、150 美元和 75 美元。他们希望看到这些合计金额和余额中的准备金如下:
-----------------------------------------------
- MONTH_YEAR - PAYMENTS - RESERVE_BALANCE -
-----------------------------------------------
- 102014 - 0.00 - 1000.00 -
-----------------------------------------------
- 112014 - 325.00 - 675.00 -
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
然后说我们在 12 月付款为零,然后在明年 1 月再付款 …
我们的 IT 车间首先开始建立一批 DBA。我们所有人(包括我自己)都是从应用程序开发/架构领域过来的,所以 DBA 领域对我们来说还很陌生。
除了建立 DBA 小组外,我们还希望在需要移动更改时构建更改管理程序和流程(希望基于最佳实践)。
我发现以下帖子对触发器、存储过程和/或 DDL 更改很有帮助。但它不一定涉及索引或供应商数据库。
我们混合使用了我们自己的数据库和供应商数据库。在我们的案例中,一些供应商(尽管不是全部)正在与我们公司合作构建数据库和应用程序。在我们的应用程序“上线”之前,我们正在对其进行性能测试。因此,我们正在大量分析索引(或缺乏索引)。
当我们遇到我们认为应该创建的索引时,我们如何最好地处理与这些相关的变更管理,包括我们自己的数据库以及任何供应商?
你在你的店里做什么?我对工具的担心比对过程的担心要少。
编辑:到目前为止,我很欣赏这个问题的反馈、评论和答案。我注意到一些答案是特定于工具的。如果可以的话,我正在寻找更多“不可知”的做法。
然而,如果不可知论是不可能的,那么对于工具集,我们主要使用 IBM DB2 LUW(实际上是在 AIX 上)。我们有一些 DB2 on Windows 和 DB2 for i(IBM 的 i5/OS),但我们主要是 AIX DB2。我们确实使用源代码控制,特别是 Subversion。
同样,寻找通用的最佳实践,但以上是我们使用的特定于供应商的方法。
编辑: 当前决定:我们打算跟踪我们的推理以及我们的变化。所以我们将在我们的问题跟踪软件(在我们的例子中是 JIRA)中打开一个问题。现在我们可以在文档中添加更改的优先级、备份更改应该是什么的数据、更改以及来自测试更改的另一个环境的更改结果。
然后,我们还打算跟踪我们在 SVN 中的脚本更改(很像下面建议的那样)。通过这种方式,我们可以跟踪存在于何处的版本。这可以记录在我们的 JIRA 问题中(以及我们使用的任何其他审计软件,即粘贴的链接)。我们可以更确定地知道什么改变了什么环境以及为什么。然后,我们还可以跟踪索引是否是我们在供应商实施之外或在其实施之前添加的内容,等等。)
我相信我了解受防护和不受防护的存储过程背后的原因。
在数据库(在我们的例子中是 DB2)的“外部”运行,以防止在出现指针等问题时数据库引擎可能损坏。
Unfenced 在数据库“内部”运行,这意味着性能更好。
根据我的研究,SQL PL 总是基本上不受限制,因为它是 SQL,因此不能像编程语言那样访问内存。
C/C++ 和 Java 过程可以在受保护或不受保护的情况下运行。但是由于它们可能会访问内存,因此应该考虑将它们围起来运行,除非可以确定代码的质量不会崩溃并且需要性能。
首先,我对上述内容的理解是否正确?
其次,从所有存储过程(甚至定义为 SQL PL 的存储过程)开始,通常是最佳实践吗?
存储过程的任何其他最佳实践,尤其是与防护和/或安全相关的?
编辑:进一步的研究表明 SQL PL 过程不能运行栅栏。由于它们不包含任何可能损害数据库引擎的代码,例如指针或文件 I/O,DB2 知道它们是安全的并在引擎内部运行它们(即,不受保护)。话虽如此,我仍在寻找有关所有其他存储过程的最佳实践。
免费的数据库建模软件领域中可用的内容。我正在开发一个 SQLExpress 数据库。
CA ERWin - 社区版虽然是免费的,但我看不到允许我创建数据库的选项,无论是使用直接连接还是通过创建 SQL 脚本文件。
Embarcardo ER/Studio - 14 天试用 我可以每 14 天重新安装一次吗?
还有什么其他的,这将允许我为我的数据库建模并创建一个“创建”脚本或“更新”sql脚本?
提前致谢。
我一直想知道索引对 SQL Server 中的表修改有什么影响。随着应用于该表的索引数量的增加,对表的修改是否会变慢?
我的直觉说这会导致重新索引的开销,但我可能是错的。
这是针对 AIX 上的 DB2 9.7 Enterprise Server Edition。
我在性能环境中对我们实例中的几个数据库进行了完整的离线备份。
我想将这些数据库恢复到我们的集成环境中。
我运行了命令
db2 restore database database_name from
/bkp/instance_name/OfflineBackups/RestorePoint/my_restore_point
taken at 20120321103846 into database_name without prompting;
Run Code Online (Sandbox Code Playgroud)
对于我的每个数据库(当然,适当地修改数据库名称和时间戳)。
每个数据库都根据 DB2 成功恢复。但是,现在当我想检查数据库是否确实恢复了我的想法时,我尝试连接到数据库,但出现错误
SQL1117N A connection to or activation of database "database_name" cannot be made
because of ROLL-FORWARD PENDING. SQLSTATE=57019
Run Code Online (Sandbox Code Playgroud)
我在以前的数据库中没有任何正在进行的事务,因为所有连接都被强制关闭并且数据库已关闭以进行脱机备份。我该怎么办?
db2 ×4
index ×2
sql-server ×2
backup ×1
db2-luw ×1
deployment ×1
facttable ×1
migration ×1
permissions ×1
postgresql ×1
restore ×1
schema ×1
tools ×1
windows ×1