Показаны сообщения с ярлыком mssql. Показать все сообщения
Показаны сообщения с ярлыком mssql. Показать все сообщения

пятница, 23 апреля 2010 г.

MSSQL Managment studio - ошибка 0xc0010014 при добавлении нового плана

Понадобилось мне добавить новую задачу на MSSQL сервер. Решил воспользоваться графическим редактором студии. Элемент бросается перетаскиванием, но при попытке его редактировать - вылезает ошибка 0xc0010014.

Нашел лечение:
%windir%\syswow64\regsvr32 "%ProgramFiles(x86)%\Microsoft SQL Server\90\dts\binn\dts.dll"

вторник, 26 января 2010 г.

Python + Psycopg2 + Win32 | Ошибка при большом кол-ве подключений к БД

Написав простецкий скрипт на питоне для копирования данных таблицы с MSSQL в PostgreSQL (+ конвертация некоторых полей) напоролся на ошибку - "psycopg.OperationalError, could not connect to server: Address already in use". Запускал скрипт я на Win32, Python2.6, Psycopg2 2.0.13. Долго ковырял гугль. Нашлась тема. И хотя она оказалась решенной ещё в 2006 году - я эту ошибку всё равно получал. Да, библиотека у меня судя по её номеру - намного "новее"...

Помучав мозг и посмотрев на код работы с psql, я увидел, что для вставки каждой строки данных я каждый раз открываю и закрываю соединение... Вот оно! А что, если открыть соединение 1 раз и кидать инсерты? Да, так и быстрее и не получаю ошибку! (вот в фоне уже 80К строк обработано, только нужно учесть, что я соединился с pgBouncer).

Ну или можно вставить time.sleep(3*60) после каждых 2К строк...

четверг, 21 января 2010 г.

MSSQL | Подлость. Никогда не доверяйте!

Был обычный день. Настал момент в базе данных у одной таблицы сменить тип с text на ntext. А таблица на 500к строк. И важная - жуть! Ок, Sql managment studio создала скрипт. Интересно, но скрипт создавал временную таблицу, копировал в неё оригинальную, потом дропал оригинальную и переименовывал временную в название оригинала. Вроде - все нормально, все обернуто транзакциями.

Да вот только обернуто то не все вместе, а каждая команда по отдельности! Ну в результате - сначала мешали внешние ключи. А потом просто - оригинальная таблица дропнулась и временной не видно!? ВСЁ!

Прощайте данные!

Да, есть бекап. Ночной. Общий на 50Гиг. Шутки в сторону. Микрософт не научил студию восстанавливать таблицы по одной. Финиш. А точнее - пипец!

Но я умный. У меня есть машина-дублер. Правда она - на постгресе!

В общем поимел я секса с sqlcmd и конвертированием ~300Мегового бекапа в стиле INSERT INTO TABLE. Хорошо что была линукс-машина и хвала vim! Особенно его комманде глобальной замены %s/что_искать/на_что_менять/gn.

Для интереса - sqlcmd работает по стандарту. Т.е. каждая команда должна завершаться пинком командой GO. Но кроме того из-за огромного размера - каждый инсерт пришлось обернуть в транзакцию.

Типа:
begin tran;
insert into ...;
commit tran;
go

Ну и конечно же вызов sqlcmd с флагом кодировки -f 65001 (это utf-8).

Всё. Живем.

среда, 12 августа 2009 г.

MSSQL: вставка большого кол-ва строк в таблицу с триггером

Наткнулся на большие задержки локов на важных таблицах. Оказалось если на таблице висит триггер на вставку, и вставить много-много строк (в моём случае было около 50 000) - очень долго выполняется вставка (около 30 сек). Лечится временным выключением триггера (если это позволительно логикой триггера):

disable [trigger_name] on [table_name];

Включение - enable.

пятница, 24 апреля 2009 г.

MSSQL: Поиск по текстам хранимых процедур

При написании программы-репликатора mssql-to-postgresql, столкнулся с необходимостью найти все хранимые процедуры, где используется какая-либо таблица.
Решение:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%искомый текст%'
AND ROUTINE_TYPE='PROCEDURE'

пятница, 17 апреля 2009 г.

MSSQL: Бекап на другую машину по сети

Зачем?
  • Нехватка места на локальном сервере

  • FailOver (если накроется сервер - бекап останется)


Как?
1. Установить сетевое устройство для бекапа можно только запросом

USE master;
GO
EXEC sp_addumpdevice ’disk’, ’networkdevice’,
’\\<servername>\<sharename>\<path>\<filename>.bak’

Памятка: нужно указывать полный путь до файла!

2. Проще создать хранимую процедуру для вызова бекап-процесса

BACKUP DATABASE [ваша_бд] TO
[networkdevice] WITH NOFORMAT, INIT,
NAME = N'имя_файла_не_важно', SKIP, REWIND, NOUNLOAD, STATS = 10;

Памятка: имя файла реально не важно. т.к. сервер считает устройство чем-то типа 'Tape'.

3. На сервере-хранителе бекапа нужно на шару поставить разрешения на запись для пользователя сервер-с-бд\имя_юзера (например sql)

4. На сервере-бд создать такого же юзера.

5. ОЧЕНЬ ВАЖНО - нужно, что бы MSSQL-сервер (служба) запускалась под созданным выше юзером. Т.к. иначе не будет доступа к 'шаре' (расшаренному каталогу на другом сервере).

6. Сделать службу (Job). В адвансед-свойствах шага поставить запуск под юзером (см. выше).

четверг, 5 марта 2009 г.

MS SQL newid() для PostgreSQL

UPDATE:
Как оказалось есть UUID. но нет функции-генератора.
Так что я поменял тип возвращаемого результата на UUID.


В данный момент работаю над переходом с MSSQL на бесплатный PostgreSQL.
Первое, на что напоролся - GUID`ов НЕТ!
Поковырял функции постгреса и написал замену:


drop function newid();
create or replace function newid() returns uuid
as $$

DECLARE r varchar='';
chars varchar='0123456789abcdef';
i int:=1;
pos int=0;
one_char varchar(1);
begin


while i<=32 LOOP
pos=round(random()*15)+1;
one_char=cast (substr(chars,pos, 1) as varchar);
r=r||one_char;
if (length(r) in (8,13,18,23)) then r=r||'-'; end if;
i=i+1;
end LOOP;

return r;
end
$$
LANGUAGE 'plpgsql';



среда, 25 февраля 2009 г.

MSSQL - удаление большого кол-ва записей

исследование темы - удаление большого кол-ва записей из БД.
результат: скрипт для пошагового удаления.
причем удалять придется не при запросе, а в автоматическом режиме. т.е. например раз в 10 часов...

* памятка:
нельзя удалять большое кол-во записей сразу, т.к.:
1. распухнет лог транзакций
2. может не хватить свободного места из-за п.1
3. доолгооо будет удалятся


WHILE 1 = 1
BEGIN
DELETE TOP (10000) --нужно использовать top т.к. rowcount в новых версиях не будет работать для delete
FROM Table1 --таблица, откуда удалять
WHERE ToBeDeleted = 't' --флаг "для удаления"

WAITFOR DELAY '000:00:05' -- 5 задержка

IF @@ROWCOUNT = 0
BREAK
END