我正在运行一个更改表,更改包含近 3000 万行的表上的列,SQL Azure 在大约 18 分钟后失败,说 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.
我猜不可能将其分解为一次修改更少的行,所以我想知道对数据库进行此更改的选项是什么。SQL Azure 不允许我更改事务日志的大小(限制为 1GB)。
我猜我最好的办法是创建一个具有新布局的新表,将数据迁移到该表中,删除原始表,然后重命名新表以匹配旧表的名称。如果是这种情况,如何最好地构建这些命令?
我们系统的计划停机时间目前不是问题,因此此操作可以根据需要进行。
我在 SQL Server 2008 R2 机器上拥有系统管理员权限。我找到了一个脚本,它可以删除所有外键,并在测试导入后需要时为我们重新添加它们。因此,我执行以下代码时没有语法错误,因为它显示了“Alter Table [ParentTable] Drop Constraint FK_Name”...总共 23 个键,但是当我刷新服务器或数据库和表时,当我为每个表展开 Keys 节点时,我仍然看到它们吗?那么为什么不丢弃它们呢?另外,如果我想再次运行以进行测试,我是否需要将其转换为永久表或将脚本放入存储过程中?请指教。
我使用了“Pinal Dave”发布的“Swastik Mishra”中的以下脚本 http://blog.sqlauthority.com/2014/04/11/sql-server-drop-all-the-foreign-key-constraint-in- database-create-all-the-foreign-key-constraint-in-database/
SET NOCOUNT ON
DECLARE @table TABLE(
RowId INT PRIMARY KEY IDENTITY(1, 1),
ForeignKeyConstraintName NVARCHAR(200),
ForeignKeyConstraintTableSchema NVARCHAR(200),
ForeignKeyConstraintTableName NVARCHAR(200),
ForeignKeyConstraintColumnName NVARCHAR(200),
PrimaryKeyConstraintName NVARCHAR(200),
PrimaryKeyConstraintTableSchema NVARCHAR(200),
PrimaryKeyConstraintTableName NVARCHAR(200),
PrimaryKeyConstraintColumnName NVARCHAR(200)
)
INSERT INTO @table(ForeignKeyConstraintName, ForeignKeyConstraintTableSchema, ForeignKeyConstraintTableName, ForeignKeyConstraintColumnName)
SELECT
U.CONSTRAINT_NAME,
U.TABLE_SCHEMA,
U.TABLE_NAME,
U.COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE U
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C
ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
C.CONSTRAINT_TYPE = 'FOREIGN KEY'
UPDATE @table SET
PrimaryKeyConstraintName …Run Code Online (Sandbox Code Playgroud) foreign-key sql-server metadata sql-server-2008-r2 alter-table
我已阅读pt-online-schema-change文档并了解它的工作原理是创建触发器并在块时间秒内复制数据块(默认为 0.5 秒)
让我们考虑下面的情况。
我们有一个 5 GB 的表 TBL1,正在使用 PT-ONLINE-SCHEMA-CHANGE 进行更改
PT-ONLINE-SCHEMA-CHANGE 使用所需的更改创建了新表,在 TBL1 上添加了触发器并开始复制。
复制了 10 个数据块,并开始复制第 11 个数据块,其大小约为“X”MB。根据工具,该块最多可在 500 毫秒或 0.5 秒内复制
在第 11 个块复制期间,应用程序发出了一个 UPDATE,它必须修改属于第 11 个数据块的有效行。
我的问题是现在发生以下哪些事情。原始表现在发生?
A) Update will be blocked till the chunk be copied and then applied on original table
which gets updated through triggers on new one.
B) Update will be performed on original table and data chunk will be re copied all
over again.
Run Code Online (Sandbox Code Playgroud)
如果选项 A 是答案,那么 PT-ONLINE-SCHEMA-CHANGE 如何实现无锁? …
我有一个表格,里面有一些希腊文本行,如nvarchar(2000).
最近,我将列的类型更改为 ,varchar(4000)但我意识到一些希腊字符显示为问号。
所以,我试图改回以nvarchar(4000)修复它,因为我认为字符的 unicode 仍然保持不变。
我只是想知道,有没有办法解决这个问题,而不是在更改表之前恢复我创建的备份?
我在更改大表(400 G)以添加索引时遇到 Mysql(5.7)错误:
ERROR 1799 (HY000): Creating index 'FTS_DOC_ID_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
Run Code Online (Sandbox Code Playgroud)
我想我必须增加,innodb_online_alter_log_max_size但我担心它是从 RAM 中取出的,因为它已经足够满了。
注意:我的路径上有足够的空间tmpdir。
有这样的问题 - 超过 2000 万行的表。
当我使用默认值添加新列时 - postgresql 锁定表超过 40 分钟,因此我的应用程序此时停止工作。
所以代替
ALTER TABLE "test" ADD COLUMN "field" boolean DEFAULT True NOT NULL;
Run Code Online (Sandbox Code Playgroud)
我愿意
ALTER TABLE "test" ADD COLUMN "field" boolean NULL;
ALTER TABLE "test" ALTER COLUMN "field" SET DEFAULT true;
Run Code Online (Sandbox Code Playgroud)
之后每个新行默认为 true,所以现在我需要更新 2000 万个当前行。我分批更新它们:
WITH cte AS (
SELECT id as pk
FROM "test"
WHERE "field" is null
LIMIT 10000
)
UPDATE "test" table_
SET "field" = true
FROM cte
WHERE table_.id = cte.pk
Run Code Online (Sandbox Code Playgroud)
之后我做
ALTER TABLE "test" ALTER …Run Code Online (Sandbox Code Playgroud) 运行此代码:
ALTER TABLE npidata
ALTER COLUMN npi varchar(20)
Run Code Online (Sandbox Code Playgroud)
给出这个错误:
消息 9002,级别 17,状态 4,第 2 行
数据库“SalesDWH”的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列
我正在将NPI列的数据类型从更改varchar(80)为varchar(20)。
下面的代码给了我同样的错误信息:
insert into npidata1 select * from npidata
Run Code Online (Sandbox Code Playgroud)
log_reuse_wait_desc 显示 NOTHINGSIMPLEautogrowth 被设定为 NONEautoshrink 被设定为 true我还可以做些什么?我的理解是日志应该在每次变得太大时截断。我究竟做错了什么?
我为许多客户提供了一个数据库系统。该数据库本地安装在 Oracle 上。
随着产品的增长,我们会定期升级数据库结构(添加新字段、重命名旧字段、更改内容)。
我的一位客户希望将他们自己的自定义视图添加到数据库中。他们向我保证,他们会将视图添加到实时模式的不同模式中。但是,我担心包含视图可能会影响未来的升级脚本。
如果视图引用了要更改的表,视图的存在是否会阻止表被更改?
我希望这个问题对某人来说很容易回答:)
我有一个看起来像这样的表(隐藏了不重要的列)
CREATE TABLE [dbo].[Log](
[LogID] [int] IDENTITY(1,1) NOT NULL,
--several other columns
[Name] [nvarchar](512) NOT NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[LogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
现在我对该表做了一些索引,这也涉及将Name-column缩短到 256 宽度。但是当我更改此列时
ALTER TABLE Log ALTER COLUMN Name NVARCHAR(256) NOT NULL
GO
Run Code Online (Sandbox Code Playgroud)
数据库增长了一个不平凡的数量。(是的,我仔细检查了 - 这是我在这里所做的唯一更改)该表总共有 90746 个条目,在更改表之前,SSMS 表示大小为 247.56MB。
但是在这次更新之后,数据库增长到了 336.13MB。
不知道这在这里是否重要,但SELECT @@VERSION得到Microsoft SQL Server …
以下是有关需要更改的表格的更多信息:
向这样的大表添加几个新列(最少 2 列)的最佳方法是什么?停机时间最短。如果不是一两天的话,仅使用直接的 ALTER 表命令将需要数小时才能完成。
附加问题:如果新列默认值设置为 NULL 而不是“预定义”值,它会影响添加新列所需的时间长度吗?
alter-table ×10
sql-server ×4
mysql ×3
auto-growth ×1
collation ×1
disk-space ×1
encoding ×1
foreign-key ×1
index ×1
innodb ×1
metadata ×1
myisam ×1
oracle ×1
percona ×1
performance ×1
postgresql ×1
unicode ×1
upgrade ×1
view ×1