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


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

©www.anekdot.ru



 



Напомню, что в прошлых публикациях цикла был собран полноценный контур сети среднего класса AD с серверами 1С Предприятие и PostgreSQL, размещенными на отечественной РЕДОС.
С отказоустойчивостью, балансировкой нагрузки, авторизацией ОС, системой взаимодействия, архивированием etc. Посмотрите, кто еще не.



При работе всплывают/вспоминаются полезные вещи, очевидные для тех, кто занимается настройкой  серверов 1С постоянно, их собираю в отдельную публикацию и далее всю мелочевку буду скидывать сюда.
Настоящие линуксовые админы или DBA не поймут, что здесь можно не запомнить.

Но, настоящий админ никогда не будет смеяться над высказываниями 1С-ника, он только сделает такое выражение бровью, как-будто поправляет монокль.



Кто не любит много букв
Пользуясь случаем, поздравляю всех с наступающим Новым 2025 Годом и Рождеством!
Желаю интересной работы, крутых проектов и, конечно же, мира, крепкого здоровья и удачи!



Остальные, приступим.



  • Комбинации клавиш Ctrl + C, Ctrl + D и Ctrl + Z

     
    Нажатие Ctrl + C заставляет терминал послать сигнал SIGINT процессу, который на данный момент его контролирует. Когда foreground-программа получает сигнал SIGINT, она обязана прервать свою работу.



    Нажатие Ctrl + D говорит терминалу, что надо зарегистрировать так называемый EOF (end of file – конец файла), то есть поток ввода окончен. Bash интерпретирует это как желание выйти из программы.
    Комбинация клавиш Ctrl + Z посылает процессу сигнал, который приказывает ему остановиться. Это значит, что процесс остается в системе, но как бы замораживается. Само собой разумеется он уходит в бэкграунд (background) – в фоновый режим. С помощью команды bg его можно снова запустить, оставив при этом в фоновом режиме. Команда fg не только возобновляет ранее приостановленный процесс, но и выводит его из фона на передний план.
    Источник


  • Скрипты для определения как размеров таблиц, так и размеров колонок MS SQL 


    Пригодятся при переводе баз 1С, при помощи утилиты автономного сервера, с MSSQL на PostgreSQL.
    Как минимум, для того чтобы определить объем данных, но как максимум, если ваши пользователи умудрятся запихнуть в одну ячейку данных более 1 ГБ (мои смогли), то перенос будет рушиться с совершенно неочевидной ошибкой.
    Ошибка СУБД server closed connection unexpectedly

    Это же в технологическом журнале.

    Эту ячейку(ки) надо будет найти при помощи скриптов, очистить и перенести другим способом.
    Сама строка запуска переноса
    <каталог 1С>\ibcmd infobase replicate --data=\tmp\ibcmd_data --dbms=MSSQLServer --database-server=<имя сервера MSSQL> --database-name=<имя БД источника> --database-user=<пользователь с правами на БД> --database-password=<его пароль>  --target-dbms=PostgreSQL --target-database-server="<сервер PostgreSQL> port=<его порт>" --target-database-name=<имя БД назначения>  --target-database-user=<пользователь с правами на БД> --target-database-password=<его пароль> --force --target-create-database
    Кажется, что дело может быть в размерах базы 1С, но это не так, дело именно в размере ячейки.

    Скрипты которые помогут это понять

    — size of tables 01



    ;with cte as (
    SELECT
    t.name as TableName,
    SUM (s.used_page_count) as used_pages_count,
    SUM (CASE
                WHEN (i.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
                ELSE lob_used_page_count + row_overflow_used_page_count
            END) as pages
    FROM sys.dm_db_partition_stats  AS s 
    JOIN sys.tables AS t ON s.object_id = t.object_id
    JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
    GROUP BY t.name
    )
    select
        cte.TableName, 
        cast((cte.pages * 8.)/1024 as decimal(10,3)) as TableSizeInMB, 
        cast(((CASE WHEN cte.used_pages_count > cte.pages 
                    THEN cte.used_pages_count — cte.pages
                    ELSE 0 
              END) * 8./1024) as decimal(10,3)) as IndexSizeInMB
    from cte
    order by 2 desc



    — size of tables 02



    SELECT 
        t.name AS TableName,
        s.name AS SchemaName,
        p.rows,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
        (SUM(a.total_pages) — SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
        CAST(ROUND(((SUM(a.total_pages) — SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
    FROM 
        sys.tables t
    INNER JOIN      
        sys.indexes i ON t.object_id = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
    INNER JOIN 
        sys.allocation_units a ON p.partition_id = a.container_id
    LEFT OUTER JOIN 
        sys.schemas s ON t.schema_id = s.schema_id
    WHERE 
        t.name NOT LIKE 'dt%' 
        AND t.is_ms_shipped = 0
        AND i.object_id > 255 
    GROUP BY 
        t.name, s.name, p.rows
    ORDER BY 
        TotalSpaceMB DESC, t.name



     



    --Size of rows table



    declare table varchar(20)
    declare @idcol varchar(20)
    declare sql varchar(1000)



    set table = 'dbo.<имя таблицы>'
    set @idcol = '<имя колонки>'
    set sql = 'select ' + @idcol +', (0'



    select sql = sql + ' + isnull(datalength(' + name + '), 1)' 
        from syscolumns where id = object_id(table)
    set sql = sql + ') as rowsize from ' + table + ' order by rowsize desc'



    exec (sql)





    Источник Stack Overflow.
    Вдогонку небольшой скрипт PostgreSQL,
    Когда перенос не пройдет, желательно удалить БД, а чтобы ее удалить надо закрыть активные соединения с ней.
    SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '<имя БД>' AND procpid <> pg_backend_pid();


  • Генераторы командной строки для утилит linux
    Очень помогут при формировании аргументов команд find, например.
    ittricks.ru/utilities/find-command-generator
    cmdgenerator.phphe.com
     
  • Более продвинутый PG Configurator
    От компании CYBERTEC PostgreSQL International GmbH
     
  • Отличная утилита для мониторинга сервера
    На замену различным atop/htop/top
    Glances

     
  • Шпаргалка по journalctl в Linux
    И кладезь знаний по linux от сайта losst.pro
     
  • Включение отладки Kerberos 
    Она может пригодится при разборе авторизации ОС.
    Все видели эти строки файла /etc/krb5.conf
    [logging]
        default = FILE:/var/log/krb5libs.log
        kdc = FILE:/var/log/krb5kdc.log
        admin_server = FILE:/var/log/kadmind.log

    Но не все знают, что они относятся только к серверу, а не к клиенту.
    На нем надо
    Для одиночной команды KRB5_TRACE=/dev/stdout kinit -V
    Для сеанса конкретного пользователя необходимо изменить файл .bash_profile в домашней директории пользователя, добавив
    export KRB5_TRACE=/tmp/<имя файла>.log
    Вариант для всех пользователей
    /etc/profile.d/krb5_set.sh 
    export KRB5_TRACE=/tmp/<имя файла>.log
    Для службы
    в файле скрипте для запуска сервиса
    Environment=KRB5_TRACE=/tmp/<имя файла>.log

    /tmp/<имя файла>.log если что можно заменить полностью на свое имя
     
  • Если в сети прокси с доменной авторизацией, а сервер не в домене
    Пригодится утилита cntlm
    NTLM / NTLM Session Response / NTLMv2 authenticating HTTP proxy 
    инструкция на сайте
    Прописать прокси аналогично сказанному выше
    Необходимо изменить файл .bash_profile в домашней директории пользователя 1С
    Вариант для всех /etc/profile.d/proxy_set.sh 
     export {http,ftp,https,rsync}_proxy="http://proxyserver:port"
     export {HTTP,FTP,HTTPS,RSYNC}_PROXY=$http_proxy
     
  • Как пересобрать кластер Patroni
    Справедливый вопрос: Зачем это может понадобиться?
    Думаю 99% прекрасно живут с кластером PostgreSQL созданным при установке.
    Одно как принято говорить, есть нюанс.
    Цитирую документацию: Из соображений безопасности новый кластер, созданный программой initdb, будет доступен только для владельца кластера. 
    Источник
    Это роль и пользователь postgres в общем случае, иными словами суперпользователь.
    Как бы это ни было странно в свете сказанного выше, но резервное копирование под суперпользователем, это дыра в безопасности.
    Выход: Ключ --allow-group-access позволяет разрешить чтение файлов в кластере всем пользователям, входящим в группу владельца кластера. Это полезно для выполнения резервного копирования от имени непривилегированного пользователя.
    Источник
    Эта опция потребует пересоздания кластера initdb.
    Базы вы, предположим, вернете из архива, но кластер выпадет из Patroni.
    Точнее из базы etcd, которую читает Patroni. Ошибку вы увидите в статусе
    systemctl status patroni.service --no-pager -l
    В ней же будет новый номер кластера.
    Далее финт ушами
    Читаем БД etcd
    etcdctl --endpoints=localhost:2379 get /<ваш namespace>/<ваш кластер>/initialize --user="root" --password="хххххх"
    Пишем новое значение в БД etcd
    etcdctl --endpoints=localhost:2379 put /<ваш namespace>/<ваш кластер>/initialize <номер кластера>--user="root" --password="хххххх"
    Перезапускаем patroni
     systemctl start patroni.service
    Проверяем что он работает штатно
    systemctl status patroni.service --no-pager -l
    /usr/local/bin/patronictl --config-file /etc/patroni/patroni.yml topology <ваш кластер>

     
  • Где менять PGDATA при установке из дистрибутива от PostgresPro 
    Лежит в файле соответствующем установленному релизу, в каталоге /etc/default
    Не могу сказать, возможно это поменялось начиная с какого то релиза PostgreSQL
    Возможно просто пробел в моем образовании, я помню что раньше в в файле скрипте для запуска сервиса, как то так
    Environment=PGDATA=/home/postgres/data
     
  • Создание псевдонимов команд с помощью alias
    Для конкретного пользователя можно добавить все необходимые команды в файл ~/.bashrc
    Если вы хотите чтобы ваши алиасы linux были доступны для всех пользователей, необходимо использовать файл /etc/bashrc
    На сервере 1С не помешает создать скрипт и сделать к нему алиас например status_1c
    clear
    systemctl status srv1cv8-8.3.хх.хххх@default --no-pager -l
    echo -e "\n\n\n"
    systemctl status ras-8.3.хх.хххх.service --no-pager -l
    echo -e "\n\n\n"
    systemctl status httpd --no-pager -l


    Другие полезные алиасы
     
  • Терминалы ssh под Windows и не только
    PuTTY дедушка все терминалов
    putty-nd, kitty и еще бесконечное количество его форков, их ищите поиском в гугле.
    MobaXterm
     на сегодняшний день и на мой взгляд лучший X server and SSH client
    Но его активно теснит WindTerm, он стильный, модный молодежный и в нем не менее приятно работать
    WinSCP классика жанра
    Все имеют портабл версии, все имеют бесплатную версию или являются бесплатными и все достойны оказаться на флешке сисадмина.


-----



 



Список будет дополняться.
Пишите в комментариях, что посоветуете добавить.



Статья продолжает серию публикаций "Рецепты от Капитана" (буду благодарен если они вам пригодятся и вы проголосуете за них на определении проекта года):





Серия "Рецепты от Капитана" на всякий случай





Планы на будущее:



Начать новую серию: Рецепты 1С: ИТС.

В ней пройти интересные публикации ИТС и проверить насколько они работают "из коробки"
Возможно в новогодние каникулы)



Благодарности:



Благодарю компанию ©Serverspace за предоставленное оборудование, без поддержки собрать такой пингвинариум мне было бы негде.



Главный спонсор это питерская погода.







А вы как думаете, почему наш город дал миру столько великих ученых и писателей?

Комментарии (2)


  1. slavius
    23.12.2024 10:38

    Так-то интересно:). Вот если-бы не странные две первые иллюстрации...


    1. capitannemo Автор
      23.12.2024 10:38

      Чем иллюстрации не подошли?