Задать вопрос
  • Что вы думаете насчет книги Брайана Кернигана "Язык программирования С"?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Она же короткая. Прочитайте обе и ещё что-нибудь сверху.
    И да, Керниган и Ритчи - это не учебник. Это фактический стандарт языка тех лет.
    Ответ написан
    Комментировать
  • Как защитить файл настройки сайта?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Перенести уровнем выше DOCUMENT_ROOT.
    В документ руте в нормальном режиме должны быть один единственный index.php и всякая (уже скомпилированная) статика вроде css, js и картинок. Всё остальное уровнем выше.
    Ответ написан
    8 комментариев
  • Как подключить PDO?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    PDO->__construct('myslq:host=loca...'

    Ну раз взяли никому не известную СУБД - то сами и пишите к ней драйвер.
    Или всё-таки правильно написать название субд.
    Ответ написан
  • Стоит ли устанавливать ОС (LInux) на флешку для домашнего мини-сервера?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если отключить swap на ней, я так подозреваю все равно кол-во записей на отказ будет не большим...

    Зато останется чтение. https://habrahabr.ru/post/214803/
    Флешку можно ушатать за пару месяцев.

    Не пожалейте дикой ёмкости аж в 2гб с каждого диска, поставьте систему на raid1. А остальную ёмкость дисков размечайте уже как нравится.
    При переустановке системы нормальный установщик софтрейд найдёт и соберёт сам.
    Ответ написан
    Комментировать
  • Какие проблемы могут быть с внешними ключами RESTRICT?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    restrict по стандарту sql дефолтный. И самый оптимальный для задачи "мешать делать глупости".
    FK надо ставить на все связи. Если только чётко и аргументированно не доказано обратное для каждого конкретного случая в отдельности.

    При миграциях есть смысл блокировать таблицы? Или транзакции должно хватить?

    Mysql? Все DDL не только не транзакционные, а ещё и вызывают неявный коммит.
    Нужно ли явно блокировать таблицы - зависит от того, что вы собираетесь сделать. Обычно задача стоит как внести изменение, не затрагивая прод.
    Ответ написан
    Комментировать
  • Восстанавливает ли программный raid сбойные блоки?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Говоря о linux raid.
    Если блок не читается - прочитает с избыточных дисков и попробует записать на сбойный диск. Если запись не удастся - выкинет диск из массива как сбойный. Если блок запишется - продолжит работу. (всё с соответствующей руганью в логи и dmesg)
    Сделает ли диск ремап для этого блока или просто успешно перезапишет имеющийся - на усмотрение прошивки этого диска. Linux raid это не волнует. Его волнует, чтобы по заданному LBA были требуемые данные.
    Обычно в пакетах дистрибьютива ставится кроновая задача раз в месяц запускать проверку массива - читаются все блоки и сравнивается их содержимое между всеми зеркалами. Что будет (кроме крика в dmesg и логах), если оба диска блоки прочитали, но выдали разные данные - не знаю. Если один из дисков не прочитал блок - то будет попытка восстановления.
    Ответ написан
  • Как написать SQL запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Errcode 28 = нет места на диске. (или инодов)

    Не очень понял, зачем вам concat понадобился.
    SELECT
      COUNT(DISTINCT `offer`) AS `cnt`,
      `webmaster`, `partner`
    FROM `orders`
    GROUP BY `webmaster`, `partner`
    HAVING `cnt` > 1
    Ответ написан
    Комментировать
  • Что будет с Ubuntu 14.04 LTS после окончания поддержки?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    На домашнем сервере пока можно и дебиан развернуть. После установки поставить нормальный init и выбросить поттерингд.
    lxc, помнится, не прибит ещё гвоздями. В отличии от libvirt, который уже прибит к policykit, но только на уровне прописанных в пакете зависимостях, а после ручной правки манифеста ставится и работает нормально.

    До такого вот состояния можно и десктоп исправить:
    melkij@melkij-work:~$ dpkg -l | grep systemd
    ii  libsystemd0:amd64                     215-17+deb8u7                        amd64        systemd utility library
    ii  libsystemd0:i386                      215-17+deb8u7                        i386         systemd utility library
    melkij@melkij-work:~$ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Debian
    Description:	Debian GNU/Linux 8.8 (jessie)
    Release:	8.8
    Codename:	jessie
    melkij@melkij-work:~$

    Если только пару пакетов взять с devuan через apt-preferences:
    Package: *
    Pin: origin packages.devuan.org
    Pin-Priority: 50
    
    Package: libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 policykit-1 udisks2 libudisks2-0 cgmanager libcgmanager0
    Pin: origin packages.devuan.org
    Pin-Priority: 700
    
    Package: systemd systemd:amd64 systemd:i386
    Pin: origin
    Pin-Priority: -1
    
    Package: pulseaudio pulseaudio:amd64 pulseaudio:i386
    Pin: origin
    Pin-Priority: -1

    Что-то около года полёт нормальный.
    Ответ написан
    Комментировать
  • Как к bigint из базы прибавить число без потерь?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Либо используйте 64-битный PHP.
    php > $a = 1122333399002222;
    php > $a += 1;
    php > var_dump($a);
    int(1122333399002223)
    Ответ написан
    3 комментария
  • Как посчитать количество записей, у которых нет "родительской" записи?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select id, name from tablename as root where not exists (
        select 1 from tablename as childs where childs.parent_id = root.id
    )

    Или аналогичным по смыслу left join'ом.
    Ответ написан
    2 комментария
  • Правильно ли использовать LOCK TABLES READ для сохранения целостности данных в этом случае?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    insert_id будет неправильный

    Невозможно. На любой интенсивность записи. Значение last insert id сессионное, а не глобальное.

    Оберните в транзакцию - тогда до коммита никто и не увидит частично записанную транзакцию. Если говорить о транзакционных вещах, конечно, а не каких-нибудь myisam.
    Ответ написан
  • Почему не работает ssh после установки разрешённых ip адресов?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    ListenAddress - это тот адрес, который демон непосредственно слушает, а не тот, откуда он ждёт пакеты.
    Разумеется, если указать какой-то адрес, которого на этой машине нет - демону не получится привязать сокет.
    Ответ написан
    3 комментария
  • Что лучше возвращать, когда уже нечего: false или null?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Заменить одним генератором yield
    Соответственно кончились данные - foreach автоматически и штатно завершается. Просто, наглядно.
    Ответ написан
    1 комментарий
  • Репликация. Правильно ли я понимаю?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    гарантирует ACID где буква «C» означает Consistency — Согласованность.

    В пределах одного кластера postgresql. Т.е. одного сервера.

    возможна ли ситуация когда ключи «X» и «Y» уже реплицированны на сервер «B», но еще не реплицированны на сервер «C»? При асинхронной репликации?

    By design. Потому это и названо асинхронной репликой. Между коммитом на мастере и приходом каждого отдельного асинхронного слейва в это состояние всегда будет какой-то временной лаг.
    Но timeline один на всех, т.к. его ведёт мастер. Ситуация, что на B записан только X, а на C только Y - исключена.

    Синхронная реплика - мастер не ответит клиенту "записано" пока не получит отклик от синхронных реплик из synchronous_standby_names, что те получили эти wal (дефолт, гарантирует, что данные есть минимум на двух машинах и при внезапном сбое вы их не потеряете), применили эти изменения (synchronous_commit=remote_write соответственно два кластера postgresql синхронны. Из-за CAP теоремы теоретически возможно, что при сбое мастера на слейве эта транзакция будет уже записана, а на мастере значится как прерванная. Не знаю, что именно по этому поводу сделано).
    Внимание, что при потере работоспособности синхронной реплики мастер будет доступен только на чтение. Все пишущие транзакции будут ждать возвращения синхронной реплики.

    Гарантируется ли согласованность в системе из нескольких реплицируемых серверов?

    Смотря чем вам допустимо жертвовать для этого. См. CAP теорему.

    Это, разумеется, справедливо только для встроенной бинарной потоковой репликации WAL. Логическая в 10 будет жить по своим особым правилам, как и сторонние триггерные решения.
    Ответ написан
    Комментировать
  • Как с помощью cat записать Exception возникающий в файл?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Ошибки принято в stderr писать, а вы только stdout перенаправляете.
    cmd 2> stderr_stream
    Ответ написан
  • Как из таблицы получить массив в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select array_agg(field) from test
    ?
    Ответ написан
    Комментировать
  • Как установить на Debian 8 x64 Java 32 bit?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    В общем случае:
    dpkg --add-architecture i386
    apt-get install packagename:i386
    Ответ написан
    Комментировать
  • Как инициализировать файлы Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    sudo rm -rf /var/lib/postgresql

    Это был home dir пользователя, а не каталог кластера. Каталог кластера в дефолтной поставке в /var/lib/postgresql/версия_pg/ещё_одна_директория_main_или_base

    sudo mkdir /media/ad/data/bd1c

    Допустим.

    su postgres -c '/usr/lib/postgresql/9.6/bin/initdb -D media/ad/data/bd1c --locale=ru_RU.UTF-8'

    Внимание на относительный путь. Я не уверен, где в итоге initdb пытался сделать базу.

    привел к виду
    data_directory = '/var/lib/pgsql'

    ? Откуда это здесь взялось?

    какой из postgresql.conf главнее

    Тот, который указан в аргументах запуска postgres. Явным образом через -c config_file либо находящийся в PGDATA в случае отсутствия аргумента с именем конфига.
    Ответ написан
    Комментировать
  • Журналирование в mongodb и postgresql - правильно ли я его понимаю?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Точно про актуальную монгу сказать что-то затрудняюсь.
    Про версию постарше цитата про вторую версию монги
    MongoDB v2.0 will consider a write to be complete, done, finito as soon as it has been buffered in the outgoing socket buffer of the client host.

    Отвечает "записано", когда данные даже не покинули машину клиента, не то что записаны хоть куда-нибудь.
    С таким подходом задумывались ли авторы над потерей данных вообще и исправлено ли сейчас?

    и тут я вспомнил что у postgresql есть параметр wal_writer_delay = 200ms, что-же получается и у postgresql может быть такая ботва что клиент думает что строка сохранена а все накрылось до сброса журнала на диск???

    Если вы намеренно выкрутили гайку synchronous_commit.

    fsync - это очень дорого. Даже на SSD.
    Поскольку это дорого, делаются какие-нибудь фокусы. Магнитные диски ненавидят случайную запись и куда лучше относятся к последовательной. Поэтому и тут тоже придумывают какие-то фокусы.
    В итоге postgresql (если вы сами не отстрелили себе ноги) пишет wal в память, отдельный процесс каждые wal_writer_delay просыпается, сбрасывает на диск накопленные wal и отмечает, в какой позиции wal гарантированно доехал до диска fsync. Поскольку synchronous_commit включен, то перед ответом клиенту "записано" воркер ждёт, пока его данные не будут записаны на диск. После этого отвечает приложению "записано".
    https://www.postgresql.org/docs/current/static/run...
    synchronous_commit (enum) Specifies whether transaction commit will wait for WAL records to be written to disk before the command returns a "success" indication to the client
    Ответ написан
    2 комментария