Отношение к жизни

Отношение к жизни

«Не придавай важности сегодняшним огорчениям. Завтра у тебя будут новые. » -Шенберг А. More »

Мониторинг состояния 1С

Мониторинг состояния 1С

Сборка наработок в одном пакете для контроля за работой и производительностью 1с More »

Конфигурация табель учета рабочего времени

Конфигурация табель учета рабочего времени

Конфигурация позволяющая автоматизировать учет рабочего времени. Может быть подключена к базе Parsek, или позволяет вести регистрацию сотрудников самостоятельно с использованием сканера штрихкода. Содержит множество аналитических отчетов. Позволяет вести подсчет различных вариантов учета рабочего времени. More »

SQL  наработки.

SQL наработки.

Моя подборка скриптов и лучшей информации по SQL, чтоб за 5 минут оптимизировать производительность. More »

Без комментариев

Без комментариев

Что я думаю об 1с More »

 

Как убрать второй значок переключения раскладки клавиатуры в RDP сессиях.

Решение проблемы:

  1. На терминальном клиенте (в запущенной сесии) Нажимаем Пуск –> Выполнить –> набираем regedit –> Ok..
  2. Заходим в ветку реестра:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
  3. В меню выбираем пункт Добавить значение, а затем вводим следующую информацию:Название значения: IgnoreRemoteKeyboardLayout
    Тип данных: REG_DWORD
    Значение данных: 1

Как настроить загрузку данных на сайт WordPress.

Создаем сначала заготовку. Для этого из админки проводи экспорт отдельной страницы.
Затем правим титлы в блоке итем, чтоб не получилось, что при загрузке страница перетерла уже существующую.

СбросЗависшихПроцессов1С77

Функция не  моя. Не проверял.

//*****************************************************************************
Процедура СбросЗависшихПроцессов1С77()
ServicesSet = ПолучитьCOMОбъект(«winmgmts:{impersonationLevel=impersonate}!\\APPEGR01\root\cimv2»);
Items = ServicesSet.ExecQuery(«Select * from Win32_Process Where Name = ‘1cv7s.exe'»);
Для каждого Item Из Items Цикл
ДатаСоздания = Дата(Лев(Item.CreationDate,14));
//Сообщить(«» + Item.ProcessId + » — » +
//Item.Name + » — » +
//Item.Description + » — » +
//Item.ExecutablePath + » — » +
//Item.Handle + » — » +
//Item.CommandLine + » — » +
//Item.Caption + » — » +
//ДатаСоздания);
Если ТекущаяДата() — ДатаСоздания > 600 Тогда
Item.Terminate();
//Сообщить(«Убили»);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

SQL-server регламентные работы

Основной материал  взят  со страницы: http://datasib.livejournal.com/32364.html#P2 —   САМОЕ ОНО.

Регламентные работы на уровне SQL-server

Одной из часто встречающихся причин неоптимальной работы системы является неправильное или несвоевременное выполнение регламентных операций на уровне СУБД. Особенно важно выполнять эти регламентные процедуры в крупных информационных системах, которые работают под значительной нагрузкой и обслуживают одновременно большое количество пользователей. Специфика таких систем в том, что обычных действий, выполняемых СУБД автоматически (на основании настроек) оказывает недостаточно для эффективной работы.

Если в работающей системе наблюдаются какие-либо симптомы проблем с производительностью, следует проверить, что в системе правильно настроены и регулярно выполняются все рекомендуемые регламентные операции на уровне СУБД.

Для MS SQL Server рекомендуется выполнять следующие регламентные операции:

  • Резервное копирование
  • Обновление статистик
  • Очистка процедурного КЭШа
  • Дефрагментация индексов
  • Реиндексация таблиц базы данных

Резервное копирование баз данных

Особенности организации резервного копирования баз данных Microsoft SQL Server на сетевой диск:

При организации резервного копирования стандартными средствами Enterprise Manager невозможно создать устройство резервного копирования, расположенное на сетевом диске, поскольку Enterprise Manager видит только локальные, физически подключенные диски. Поэтому выполнение резервного копирования возможно только на локальные диски компьютера, на котором установлен Microsoft SQL Server. Использование этого варианта организации резервного копирования существенно снижает надежность, поскольку в случае выхода компьютера из строя становится недоступной как рабочая база данных, так и резервная копия.

Решить эту проблему можно путем создания сетевого устройства резервного копирования с помощью системной процедуры SP_ADDUMPDEVICE. Для этого нужно в Query Analyzer выполнить следующую команду:

EXEC SP_ADDUMPDEVICE ‘disk’, Логическое_Имя_Сетевого_Устройства_Резервного_Копирования’, ‘\\Имя_Компьютера\Имя_Каталога\Имя_Файла.bak’

Необходимым условием использования сетевого устройства резервного копирования является запуск Microsoft SQL Server с использованием доменной учетной записи. Проверить и изменить учетную запись, используемую для запуска Microsoft SQL Server можно в Enterprise Manager, на закладке Security диалога редактирования свойств  Microsoft SQL Server.

После создания сетевого устройства резервного копирования его можно использовать при выполнении резервного копирования средствами Enterprise Manager или с помощью команды BACKUP DATABASE выполняемой в Query Analyzer, например:

BACKUP DATABASE Имя_Базы_Данных ТО Устройства_Резервного_Копирования

Обновление статистик

MS SQL Server строит план запроса на основании статистической информации о распределении значений в индексах и таблицах. Статистическая информация собирается на основании части (образца) данных и автоматически обновляется при изменении этих данных. Иногда этого оказывается недостаточно для того, что MS SQL Server стабильно строил наиболее оптимальный план выполнения всех запросов.

В этом случае возможно проявление проблем с производительностью запросов. При этом в планах запросов наблюдаются характерные признаки неоптимальной работы (неоптимальные операции).

Для того, чтобы гарантировать максимально правильную работу оптимизатора MS SQL Server рекомендуется регулярно обновлять статистики базы данных MS SQL.

Для обновления статистик по всем таблицам базы данных необходимо выполнить следующий SQL запрос:

exec sp_msforeachtable N’UPDATE STATISTICS ? WITH FULLSCAN’

Обновление статистик не приводит к блокировке таблиц, и не будет мешать работе других пользователей. Статистика может обновляться настолько часто, насколько это необходимо. Следует учитывать, что нагрузка на сервер СУБД во время обновления статистик возрастет, что может негативно сказаться на общей производительности системы.

Оптимальная частота обновления статистик зависит от величины и характера нагрузки на систему и определяется экспериментальным путем. Рекомендуется обновлять статистики не реже одного раза в день.

Приведенный выше запрос обновляет статистики для всех таблиц базы данных. В реально работающей системе разные таблицы требуют различной частоты обновления статистик. Путем анализа планов запроса можно установить, какие таблицы больше других нуждаются в частом обновлении статистик, и настроить две (или более) различных регламентных процедуры: для часто обновляемых таблиц и для всех остальных таблиц. Такой подход позволит существенно снизить время обновления статистик и влияние процесса обновления статистики на работу системы в целом.

Очистка процедурного КЭШа

Оптимизатор MS SQL Server кэширует планы запросов для их повторного выполнения. Это делается для того, чтобы экономить время, затрачиваемое на компиляцию запроса в том случае, если такой же запрос уже выполнялся и его план известен.

Возможна ситуация, при которой MS SQL Server, ориентируясь на устаревшую статистическую информацию, построит неоптимальный план запроса. Этот план будет сохранен в процедурном КЭШе и использован при повторном вызове такого же запроса. Если Вы обновили статистику, но не очистили процедурный кэш, то SQL Server может выбрать старый (неоптимальный) план запроса из КЭШа вместо того, чтобы построить новый (более оптимальный) план.

Таким образом, рекомендуется всегда после обновления статистик очищать содержимое процедурного КЭШа.

Для очистки процедурного КЭШа MS SQL Server необходимо выполнить следующий SQL запрос:

DBCC FREEPROCCACHE

Этот запрос следует выполнять непосредственно после обновления статистики. Соответственно, частота его выполнения должна совпадать с частотой обновления статистики.

Настройка очистки процедурного КЭШа (MS SQL 2005)

Поскольку процедурный КЭШ необходимо очищать при каждом обновлении статистики, данную операцию рекомендуется добавить в уже созданный субплан «Обновление статистик».

Для этого следует открыть субплан и добавить в его схему задачу Execute T-SQL Statement Task. Затем следует соединить задачу Update Statistics Task стрелочкой с новой задачей. В тексте созданной задачи Execute T-SQL Statement Task следует указать запрос «DBCC FREEPROCCACHE»:

Дефрагментация индексов

При интенсивной работе с таблицами базы данных возникает эффект фрагментации индексов, который может привести к снижению эффективности работы запросов.

Рекомендуется регулярное выполнение дефрагментации индексов. Для дефрагментации всех индексов всех таблиц базы данных необходимо использовать следующий SQL запрос (предварительно подставив имя базы):

sp_msforeachtable N’DBCC INDEXDEFRAG (<имя базы данных>, »?»)’

Дефрагментация индексов не блокирует таблицы, и не будет мешать работе других пользователей, однако создает дополнительную нагрузку на SQL Server. Оптимальная частота выполнения данной регламентной процедуры должна подбираться в соответствии с нагрузкой на систему и эффектом, получаемым от дефрагментации. Рекомендуется выполнять дефрагментацию индексов не реже одного раза в день.

Возможно выполнение дефрагментации для одной или нескольких таблиц, а не для всех таблиц базы данных. Рекомендуется выполнять задачу не реже одного раза в неделю, а при высокой изменчивости данных в базе еще чаще – до одного раза в день.

Реиндексация таблиц базы данных

Реиндексация таблиц включает полное перестроение индексов таблиц базы данных, что приводит к существенной оптимизации их работы. Рекомендуется выполнять регулярную переиндексацию таблиц базы данных. Для реиндексации всех таблиц базы данных необходимо выполнить следующий SQL запрос:

sp_msforeachtable N’DBCC DBREINDEX (»?»)’

Реиндексация таблиц блокирует их на все время своей работы, что может существенно сказаться на работе пользователей. В связи с этим реиндексацию рекомендуется выполнять во время минимальной загрузки системы.

После выполнения реиндексации нет необходимости делать дефрагментацию индексов.

Рекомендуется выполнять задачу во время минимальной нагрузки на систему, не реже одного раза в неделю.

Перенос файлов по разным дискам

EXEC sp_detach_db `pubs`

Затем производится копирование файлов pubs.mdf и pubs_log.ldf на нужный диск (D). Следующий пример показывает, как скопировать эти два файла в каталог d:\mssql7\data:

copy c:\mssql7\data\pubs.mdf d:\mssql7\datacopy
c:\mssql7\data\pubs_log.ldf d:\mssql7\data

Наконец, после завершения копирования файлов можно воспользоваться командой sp_ attach_db для подсоединения базы данных к SQL Server:

EXEC sp_attach_db `pubs`, `d:\mssql7\data\pubs.mdf`,
`d:\mssql7\data\pubs_log.ldf`

Не могу подключиться к базе 1с

Здравствуйте.  После перехода на платформу 8.3.7  и 8.3.8 стала появляться  проблема:

если пользователь  входил в программу и в этот момент что-то  случилось с 1с, то может появиться пустое подключение, т.е.  сеанса не будет, а подключение не  сбрасывается  с консоли кластера.

Решение: ищем в рабочих процессах зависшее соединение, затем  запускаем диспетчер задач и убиваем процесс с номером, в котором висит это  соединение.

Т.к.  такие выкрутасы 1с стали достаточно часто я настроил не более 2-х баз на  процесс.

Кстати  замечено, что после перехода на 8.3.8  тормозов стало  раз в 5 меньше.

 

Рабочий скрипт для обрезки журнала транзакций ( тестовый сервер)

—Ниже приведенный  скрипт  переводит  все базы в режим симпл, затем обрезает  журналы транзакций.

DECLARE @ShrinkDbTemplte AS nvarchar(max);
declare @TextN nvarchar(250);

SET @ShrinkDbTemplte =
N’    CREATE TABLE #Swallow(DbId int, Fileld int, CurrentSize int, MininumSize int, UsedPages int, EstimatedPages int)
DECLARE @SizeBefore AS numeric(12,0)
DECLARE @SizeAfter  AS numeric(12,0)
DECLARE @LogicalFileName AS VARCHAR(254)
DECLARE @B_Name AS VARCHAR(254);

USE [<dbName>]
ALTER DATABASE [<dbName>] SET RECOVERY SIMPLE
set @B_Name = DB_NAME();
WAITFOR DELAY »00:00:01»;
raiserror(»%s переведена в симпл: »,10,1,  @B_Name)with nowait

—DECLARE @SizeBefore AS numeric(12,0)
—DECLARE @SizeAfter  AS numeric(12,0)
—DECLARE @LogicalFileName AS VARCHAR(254)
DECLARE CuteCursor CURSOR STATIC FOR
SELECT
Name,
(size*8)/1024 SizeMB
FROM sys.master_files
WHERE database_id = db_id()
AND type = 1 — Only ldf files
SET @MbFreed = 0

OPEN CuteCursor
WHILE ( 1 = 1 )
BEGIN
FETCH CuteCursor INTO @LogicalFileName, @SizeBefore
IF (@@FETCH_STATUS <> 0) BREAK
DBCC SHRINKFILE( @LogicalFileName, 0, TRUNCATEONLY) WITH NO_INFOMSGS
SELECT @SizeAfter = (size*8)/1024 FROM sys.master_files
WHERE database_id = db_id() AND Name = @LogicalFileName
SET @MbFreed = @MbFreed + @SizeBefore — @SizeAfter

WAITFOR DELAY »00:00:01»;
raiserror(»%s Сжатие логфайла окончено:»,10,1,  @LogicalFileName )with nowait

END
CLOSE      CuteCursor
DEALLOCATE CuteCursor

DECLARE @ShrinkDbScript AS nvarchar(max)
DECLARE @DbName AS nvarchar(max)

DECLARE DbCursor CURSOR STATIC FOR
SELECT name FROM master..sysdatabases
WHERE Name <> ‘tempdb’

DECLARE @MbFreed AS INT
DECLARE @TotalFreed AS INT
SET @TotalFreed = 0
OPEN DbCursor
WHILE ( 1 = 1 )
BEGIN
FETCH DbCursor INTO @DbName
IF (@@FETCH_STATUS <> 0) BREAK
SET @ShrinkDbScript = REPLACE( @ShrinkDbTemplte, ‘<dbName>’, @DbName )
EXEC sp_executesql @ShrinkDbScript, N’@MbFreed INT OUTPUT’, @MbFreed = @MbFreed OUTPUT
SET @TotalFreed = @TotalFreed + @MbFreed
END
CLOSE      DbCursor
DEALLOCATE DbCursor
PRINT CAST(@TotalFreed AS VARCHAR(16)) + ‘ Mb freed.’

Обработка ошибки «88 ожидание команды продолжения печати»

Кулаков Антон писал(а):
Отключите на короткое время ФП. ФР перейдет в режим 9 и из теста драйвера вы сможете сделать техобнуление.

Спасибо, всё получилось!

P.S. Для тех, кто делает тех.обнуление самостоятельно (расскажу про свои «затыки», вдруг кому-то поможет):
— После отключения/включения ФП и включения аппарата начинает мигать кнопка «Ошибка» и подаются звуковые сигналы. Это нормально.
— Зашла в тест драйвера ФР, стада жать «Проверку связи» — выдалась ошибка «-1 нет связи». Думала, что всё-таки что-то сделала не так… но потом запустила поиск оборудования и обнаружила, что сбросилась настройка скорости. У меня была 115200, а стала — 4800. Когда я выставила значение 4800, то проверка связи прошла на ура. Ну и далее просто жмётся кнопка «Тех.обнуление», затем — установка и подтверждение даты. Всё! :)

Выполнение команд операционной системы в MS SQL

http://blog.yastrebkov.com/2008/04/ms-sql.html

Выполнение команд операционной системы в MS SQL

MS SQL Server позволяет выполнять команды операционной системы и возвращать результат в виде текстовых строк. Например, прямо из SQL Server можно запустить bat-файл, любую программу и вообще использовать все возможности командной строки.

Для этого используется системная хранимая процедура xp_cmdshell. Запуск этой процедуры по умолчанию запрещен. Чтобы включить эту возможность нужно выполнить следующий код:

-- Включение разрешения изменения расширенных опций.
EXEC sp_configure 'show advanced options', 1
GO
-- Обновление текущих настроек расширенных опций.
RECONFIGURE
GO
-- Включение возможности запуска внешних программ.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- Обновление текущих настроек для запуска внешних программ.
RECONFIGURE
GO

Теперь для запуска bat-файла достаточно выполнить следующую команду:

EXEC master..xp_cmdshell ‘test.bat’

Или эту, если вы хотите подавить вывод результатов:

EXEC master..xp_cmdshell ‘test.bat’, NO_OUTPUT

А вот пример вызова bat-файла с параметром:

DECLARE @param varchar(50)
DECLARE @cmd varchar(100)
SET @param = 'blog.yastrebkov.com'
SET @cmd = 'c:\test.bat ' + @param
EXEC master..xp_cmdshell @cmd

SQl- список индексов требующих обработки (дефрагментации,реиндексации)

— Параметры скрипта
declare @database_names as nvarchar(max) = N’Test_basa’; — имена баз задавать через запятую, если не заданы, то все несистемные базы
— пока парсер примитивный — строка просто делится по запятым и обрезаются крайние пробелы
— (если в имени базы будет запятая или в начале или конце имени пробел, то система не работает)
— если указано «-ИмяБазы», то база будет исключена,
declare @index_size_threshhold as int = 1024;   — минимальный размер в КБ для перестраиваемого индекса. Нет смысла перестраивать индексы на десяток страниц
declare @index_rebuild_threshhold as numeric(5,2) = 25; — показатель фрагментации, начиная с которого происходит перестроение индекса
declare @index_defrag_threshhold as numeric(5,2) = 12;  — показатель фрагментации, начиная с которого происходит дефрагментация индекса
declare @index_rebuild_space_used_threshhold as numeric(5,2) = 50; — процент заполненности страниц меньше которого требуется перестроение индекса
declare @timeout as int = 7200; — максимальное время работы скрипта
declare @max_size as bigint = 536870912; — максимальный суммарный обрабатываемый размер в КБ (чтобы не нагенерировать логов на терабайты) — 512*1024*1024 КБ = 0,5 ТБ
declare @is_emulate as bit = 0; — 0 — выполнять, 1 — только вывести команды
declare @TextN nvarchar(250);
set nocount on;
use master;

declare @indexes as table (
database_name nvarchar(128) not null,
schema_name nvarchar(128) not null,
table_name nvarchar(128) not null,
index_name nvarchar(128) not null,
is_clustered bit not null,
size_kb bigint not null,
fragmentation numeric(5,2) not null
);
declare @database_names_table as table (
name nvarchar(128) not null primary key
);
if object_id(‘tempdb..#index_stats’) is not null
drop table #index_stats;
create table #index_stats (
database_id smallint not null,
object_id int not null,
index_id int not null,
index_type_desc nvarchar(60) not null,
avg_fragmentation_in_percent float not null,
page_count bigint not null,
avg_page_space_used_in_percent float not null,
record_count bigint not null,
index_name nvarchar(128),
table_name nvarchar(128),
schema_name nvarchar(128),
db_name nvarchar(128)
)

print ‘— ‘ + convert(nvarchar(max), getdate(), 121) + ‘ — Поиск баз данных для обслуживания’
declare @timeout_datetime datetime = dateadd(second, @timeout, getdate());

— Создание списка обслуживаемых БД по @database_names
with database_name_table(database_names_tail, database_name) as
(
select
substring(@database_names, nullif(charindex(‘,’, @database_names, 1), 0) + 1, len(@database_names) + 1),
rtrim(ltrim(left(@database_names, isnull(nullif(charindex(‘,’, @database_names, 1), 0) — 1, len(@database_names)))))
where
@database_names is not null
union all
select
substring(database_names_tail, nullif(charindex(‘,’, database_names_tail, 1), 0) + 1, len(database_names_tail) + 1),
rtrim(ltrim(left(database_names_tail, isnull(nullif(charindex(‘,’, database_names_tail, 1), 0) — 1, len(database_names_tail)))))
from database_name_table db
where
database_names_tail is not null
),
database_names_with_indicator(database_name, indicator) as
(
select
db_name(db_id(case when database_name like ‘-%’ then rtrim(ltrim(substring(database_name, 2, len(database_name)))) else database_name end)),
case when database_name like ‘-%’ then 1 else 0 end
from database_name_table db
where db_name(db_id(case when database_name like ‘-%’ then rtrim(ltrim(substring(database_name, 2, len(database_name)))) else database_name end)) is not null
)
insert @database_names_table (name)
select name
from sys.databases db
where
db.name not in (‘master’, ‘model’, ‘tempdb’, ‘msdb’) — системные базы данных обычно не требуется переиндексировать
and db.name not in (select dbi.database_name from database_names_with_indicator dbi where indicator = 1)
and ((select top 1 dbi.database_name from database_names_with_indicator dbi where indicator = 0) is null or
db.name in (select dbi.database_name from database_names_with_indicator dbi where indicator = 0))
;

set @TextN = ‘— ‘ + convert(nvarchar(max), getdate(), 121) + ‘ — найдено ‘ + convert(nvarchar(max), @@rowcount) + ‘ баз данных для обслуживания’;
—print ‘— ‘ + convert(nvarchar(max), getdate(), 121) + ‘ — найдено ‘ + convert(nvarchar(max), @@rowcount) + ‘ баз данных для обслуживания’
WAITFOR DELAY ’00:00:05′;
raiserror(‘%s пройдено’,10,1, @TextN )with nowait

print ‘— ‘ + convert(nvarchar(max), getdate(), 121) + ‘ — Поиск индексов для обслуживания’
— курсором обходим выбранные БД и ищем индексы и данные по их фрагментации
declare @database_cursor as cursor;
declare @current_database as nvarchar(128);
set @database_cursor = cursor forward_only for
select name from @database_names_table;
open @database_cursor;
fetch @database_cursor into @current_database;

while (@@FETCH_STATUS = 0)
begin

insert #index_stats
(database_id, object_id, index_id, index_type_desc, avg_fragmentation_in_percent,
page_count, avg_page_space_used_in_percent, record_count)
select
database_id, object_id, index_id, index_type_desc, max(avg_fragmentation_in_percent),
sum(page_count), sum(avg_page_space_used_in_percent*page_count)/isnull(nullif(sum(page_count),0),1), sum(record_count)
from
sys.dm_db_index_physical_stats( db_id(@current_database), null, null, null, ‘DETAILED’) ips
where
ips.index_id>0 — убираем кучи (heap)
and ips.index_type_desc in (N’CLUSTERED INDEX’, N’NONCLUSTERED INDEX’) — всякие хитрые индексы не обрабатываем
and ips.alloc_unit_type_desc = N’IN_ROW_DATA’ — обрабатываем только по «обычным» записям
and ips.index_level = 0
group by database_id, object_id, index_id, index_type_desc
having sum(page_count)*8 >= @index_size_threshhold

exec (‘use [‘ + @current_database + ‘];
update i
set
i.db_name = db_name(),
i.table_name = t.name,
i.schema_name = s.name,
i.index_name = ci.name
from #index_stats i
left join sys.tables t on i.object_id = t.object_id
left join sys.schemas s on t.schema_id = s.schema_id
left join sys.indexes ci on i.object_id = ci.object_id and i.index_id = ci.index_id
where
i.database_id = db_id();’);

fetch @database_cursor into @current_database;
end;
select * from #index_stats