powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / переименовать таблицу
26 сообщений из 26, показаны все 2 страниц
переименовать таблицу
    #39852634
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день.

надо заменить таблицу на вид с точно таким же названием.
теоретически, это элементарно:
Код: sql
1.
2.
3.
4.
begin tran
  exec sp_rename 'table1', 'table1_old'
  exec sp_rename 'view1', 'table1'
commit


но возникла проблема боевом сервере:
непрерывные запросы к таблице не дают её переименовать.
запросы типа "select * from table1 where id = 123" идут с IIS клинта напрямую, а остановить работу ISS нельзя.
перевести БД в single_user тоже нельзя.
сервер обязан работать 24/7. ~600 соединений, ~150 запросов в секунду.
убивать соединения можно. пробовал убивать соединения блокирующие таблицу, но пока 600 раз выполняется команда kill, успевают создасться новые соединения.

MS SQL 2016 SP2

как переименовать?
спасибо
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852677
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
begin tran
select top(0) * from table1 with(tablockx, holdlock)
exec sp_rename 'table1', 'table1_old'
exec sp_rename 'view1', 'table1'
commit
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852680
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

Можете попробовать подставить свои выражения, рано или поздно изменение проскочит:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/*
Автор: Колосов В.В.
Назначение: удаление индекса под рабочей нагрузкой
*/
set lock_timeout 1000;



while exists 
	(
	select * from sys.indexes where name = 'ix_web_log' and object_id = object_id('dbo.web_log')
	)
begin
	begin try
		drop index ix_web_log on dbo.web_log;
	end try
	begin catch
	end catch;
	waitfor delay '00:00:00.3';
end

:
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852698
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvно возникла проблема боевом сервере:
непрерывные запросы к таблице не дают её переименовать.
запросы типа "select * from table1 where id = 123" идут с IIS клинта напрямую, а остановить работу ISS нельзя.
перевести БД в single_user тоже нельзя.
сервер обязан работать 24/7. ~600 соединений, ~150 запросов в секунду.Такие вопросы всегда решаются административно. В нужное время назначается технологический интервал и об этом сообщается всемзаинтересованым.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852699
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator, а ещё мне жаль ваш сервер. Без профилактики, бедняга.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852716
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvкак переименовать?Запустить и ждать пока не выполнится.
Сервер не дурак - новые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename.

Если желаете ускорить, то можете уже после запуска sp_rename отстреливать сессии, удерживающие несовместимые блокировки на нужную таблицу.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852731
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222begin tran
select top(0) * from table1 with(tablockx, holdlock)
exec sp_rename 'table1', 'table1_old'
exec sp_rename 'view1', 'table1'
commit к сожалению, нет.
запросы с уровнем "грязное чтение" (hint "nolock") так не блокируются.
они накладывают SCH-S лок, который мешает переименованию.

invmvalvкак переименовать?Запустить и ждать пока не выполнится.
Сервер не дурак - новые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename.

Если желаете ускорить, то можете уже после запуска sp_rename отстреливать сессии, удерживающие несовместимые блокировки на нужную таблицу. отстреливать сессии - это перспективный путь, но слишком их много.
не успеваю, IIS сервера создают их быстрее чем ms sql server их убивает.
как бы замедлить создание новых сессий?
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852741
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvотстреливать сессии - это перспективный путь, но слишком их много.
не успеваюВы внимательно прочитали, что я написал? Особенно второе предложение?
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852755
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmvalvотстреливать сессии - это перспективный путь, но слишком их много.
не успеваюВы внимательно прочитали, что я написал? Особенно второе предложение?
Вы о invmЗапустить и ждать пока не выполнится.
Сервер не дурак - новые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename. ?
это неверно. запросы с уровнем "грязное чтение" (hint "nolock") не ждут завершения транзакции, а свободно читают из таблицы.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852769
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvinvmпропущено...
Вы внимательно прочитали, что я написал? Особенно второе предложение?
Вы о invmЗапустить и ждать пока не выполнится.
Сервер не дурак - новые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename. ?
это неверно. запросы с уровнем "грязное чтение" (hint "nolock") не ждут завершения транзакции, а свободно читают из таблицы.
и как же они умудряются получить свой SCH-S ?
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852796
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvalvэто неверно. запросы с уровнем "грязное чтение" (hint "nolock") не ждут завершения транзакции, а свободно читают из таблицы.
и как же они умудряются получить свой SCH-S ?
см. таблицу совместимости локов.
sch-s совместим со всеми, за исключением sch-m.
а его то и нужно получить для переименования.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852805
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvTaPaKпропущено...

и как же они умудряются получить свой SCH-S ?
см. таблицу совместимости локов.
sch-s совместим со всеми, за исключением sch-m.
а его то и нужно получить для переименования.

чукча не читатель?

авторновые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852811
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvalvпропущено...

см. таблицу совместимости локов.
sch-s совместим со всеми, за исключением sch-m.
а его то и нужно получить для переименования.

чукча не читатель?

авторновые соединения, желающие доступа к таблице, будут ждать завершения транзакции с sp_rename.
чувачок не догоняет?

запросы которые читают с (nolock) не будут ждать. проверено. MS SQL 2016.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852820
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvTaPaKпропущено...


чукча не читатель?

пропущено...

чувачок не догоняет?

запросы которые читают с (nolock) не будут ждать. проверено. MS SQL 2016.
неа не догоняет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE dbo.A
(
	ID INT
)

CREATE TABLE dbo.B
(
	ID INT
)

-- connection 1
WHILE 1 = 1
BEGIN 
	SELECT TOP 0 * FROM dbo.b (NOLOCK)
END

-- connection 2
BEGIN TRAN
  exec sp_rename 'a', 'a_old'
  exec sp_rename 'b', 'a'
COMMIT



DROP TABLE dbo.a
DROP TABLE dbo.b
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852825
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvзапросы которые читают с (nolock) не будут ждать. проверено. MS SQL 2016.Плохо проверяли.

1.Создаем таблицу
Код: sql
1.
2.
3.
4.
5.
use tempdb;
go

create table dbo.t (id int);
insert into dbo.t values (1), (2), (3);


2. В первой сессии запускаем чтение
Код: sql
1.
2.
3.
4.
5.
6.
use tempdb;
go

begin tran;
select count(*) from dbo.t with (tablock, repeatableread);
--commit;


3. Во второй сессии запускаем переименование
Код: sql
1.
2.
3.
4.
5.
6.
use tempdb;
go

begin tran;
exec sp_rename 'dbo.t', 't2', 'object'
--rollback;


4. В третьей сессии запускаем "грязное" чтение
Код: sql
1.
2.
3.
4.
5.
6.
use tempdb;
go

begin tran;
select count(*) from dbo.t with (nolock);
--commit;



Впрочем, уговаривать не буду - продолжайте страдать.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852827
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,

дело не в этом, рано или поздно снимется последняя блокировка стабильности и будет наложена блокировка изменения, которая до этого стояла в очереди.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852829
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовvalv,

дело не в этом, рано или поздно снимется последняя блокировка стабильности и будет наложена блокировка изменения, которая до этого стояла в очереди.
тс думает что сервер смотрит, О! стоит сессия с запросом sch-m и прилетает новая с sch-s, и сервер: та пусть ещё подождёт, этому же только спросить....
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852831
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKvalvпропущено...

чувачок не догоняет?

запросы которые читают с (nolock) не будут ждать. проверено. MS SQL 2016.
неа не догоняет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE dbo.A
(
	ID INT
)

CREATE TABLE dbo.B
(
	ID INT
)

-- connection 1
WHILE 1 = 1
BEGIN 
	SELECT TOP 0 * FROM dbo.b (NOLOCK)
END

-- connection 2
BEGIN TRAN
  exec sp_rename 'a', 'a_old'
  exec sp_rename 'b', 'a'
COMMIT



DROP TABLE dbo.a
DROP TABLE dbo.b


в данном примере таблица будет переименована в момент между итерациями
Код: sql
1.
SELECT TOP 0 * FROM dbo.b (NOLOCK)

в нашей ситуации, несколько сотен запросов параллельно обращаются к таблице.
не существует момента времени когда таблица не блокируются.

собственно, в этом и вопрос.
как создать миг, когда можно наложить sch-m и переименовать.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852837
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, действительно так и думает
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852838
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосовvalv,

дело не в этом, рано или поздно снимется последняя блокировка стабильности и будет наложена блокировка изменения, которая до этого стояла в очереди.
Владислав,
возможно существует решение без "рано или поздно",
и кто нибудь знает и посоветует?
транзакция с sp_rename - она же не безобидный select, она препятствует нормальной работе.
должен же быть способ освободить одну единственную таблицы на миллисекунду без того чтобы останавливать всю БД?
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852843
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvубивать соединения можно. пробовал убивать соединения блокирующие таблицу, но пока 600 раз выполняется команда kill, успевают создасться новые соединения.

ну попробуйте ломом:
блокировка логина, отстрел коннектов, переименовка, разблокировка логина
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852850
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komradvalvубивать соединения можно. пробовал убивать соединения блокирующие таблицу, но пока 600 раз выполняется команда kill, успевают создасться новые соединения.

ну попробуйте ломом:
блокировка логина, отстрел коннектов, переименовка, разблокировка логина
на буржуинском форуме тоже самое посоветовали...
фактически, это то же самое как single_user restriction или остановка IIS. БД какое-то время не будет работать.
беда...
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852860
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvkomradпропущено...


ну попробуйте ломом:
блокировка логина, отстрел коннектов, переименовка, разблокировка логина
на буржуинском форуме тоже самое посоветовали...
фактически, это то же самое как single_user restriction или остановка IIS. БД какое-то время не будет работать.
беда...

потому что не бывает изменения схемы в онлайне. Люди планируют окна за полгода вперёд и тд и тп
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852864
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv,
ну можно попробовать право на селект отобрать вместо блокировки
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852891
valv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komradvalv,
ну можно попробовать право на селект отобрать вместо блокировки
гениально!!!
komrad, спасибо большое.
уже тестирую.
...
Рейтинг: 0 / 0
переименовать таблицу
    #39852897
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valvkomradvalv,
ну можно попробовать право на селект отобрать вместо блокировки
гениально!!!
komrad, спасибо большое.
уже тестирую.
На выходе:
1. Шквал ошибок на клиентах
2. Простой ровно как и с блокировкой
3. Неясный результат по бизес логики такого отсреливания

самый эффектные грабли раскладываются с большой любовью
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / переименовать таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]