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

При обучении студентов работе с базами данных мной была выбрана СУБД PostgreSQL -хотя она и считается несколько сложной для изучения, чем та же MySQL, это достаточно популярный и к тому же бесплатный продукт, с открытым исходным кодом, и самое главное - у неё есть в том числе и российские корни. С литературой по PostgreSQL ситуация оказалась двоякой: с одной стороны, книг по ней не так уж и много, как хотелось бы, с другой стороны, с 2015 года компания Postgres Professional делает полный перевод документации PostgreSQL на русский язык, за что им огромное спасибо. Но... для установки и первоначальной настройки, чтобы студенты, впервые видящие PostgreSQL, с первого раза могли всё сделать правильно, этого оказалось недостаточно, что и побудило меня написать эту статью. Возможно, некоторые моменты вам покажутся слишком очевидными, но, поверьте, реальные студенты спотыкаются даже на этом.

Чтобы установить СУБД PostgreSQL в Ubuntu Linux (мы используем в основном версию 22.04 и пробуем 24.04), нужно выполнить одно из следующих действий:

  1. Ввести в "Центре приложений" postgresql и выбрать одно из приложений (в убунту-22.04 на выбор предлагаются версии 9.5 и 10, хотя в 2024 году уже вышла 17 версия). Хотя этот вариант и максимально прост, нам он не подходит, поэтому переходим к "плану б".

  2. Установить postgresql вручную, вводя команды в терминале. Далее показаны все шаги такой установки и настройки

До загрузки PostgreSQL обновляем списки пакетов:

$ sudo apt update

Загрузим PostgreSQL с утилитой postgresql-contrib:

$ sudo apt install postgresql postgresql-contrib

Загрузятся драйверы PostgreSQL последней версии (обратите внимание: не самой последней версии, доступной у разработчика СУБД, а последней версии, поддерживаемой Вашей версией операционной системы Linux и хранящейся в её репозиторях. В случае с ubuntu-20.04 это будет 12 версия, в 22.04 - 14, в 24.04 - 16.4) и развернутся необходимые компоненты на виртуальной машине с Ubuntu. Чтобы СУБД начала работать, необходимо запустить её как сервис:

$ sudo systemctl start postgresql.service

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

Проверим статус сервиса:

$ sudo systemctl status postgresql.service

В ответ на эту команду система запросит пароль суперпользователя, а получив его - выведет сообщение:

● postgresql.service - PostgreSQL RDBMS     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr>     Active: active (exited) since Wed 2024-11-06 08:12:35 MSK; 11h ago   Main PID: 2047 (code=exited, status=0/SUCCESS)        CPU: 1ms
ноя 06 08:12:35 m40-A320M-H systemd[1]: Starting PostgreSQL RDBMS...
ноя 06 08:12:35 m40-A320M-H systemd[1]: Finished PostgreSQL RDBMS.

Чтобы вернуться в терминал, нажмём Ctrl+Z, это переведёт команду в фоновый режим, но не остановит её выполнение.

Сервис развернули, теперь разберемся в работе аккаунтов. PostgreSQL для обозначения аккаунта применяет термин «Роль». В Linux-системе роли сервиса привязываются к одноименным аккаунтам. При установке PostgreSQL в системе создаётся аккаунт postgres, получающий в СУБД максимальные права (в СУБД, но не в операционной системе!). Этот аккаунт нужен для того, чтобы создавать пользователей и новые базы данных и связывать их. Самый важный принцип работы в PostgreSQL прост: один пользователь - одна база данных (и его можно нарушить - но только в том случае, если вы осознаёте, чем это грозит, и принимаете на себя все риски).

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

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

kab18-05@kab1805:~$
Скрытый текст

Имя пользователя отделено от имени хоста знаком @, после имени хоста стоит двоеточие, за которым следует указание места положения (папки), в которой сейчас находится пользователь (команда, выполненная пользователем, будет взаимодействовать с файлами, находящимися в этой папке). Знак тильда (~) обозначает домашнюю папку текущего пользователя (то есть /home/kab18-05). После тильды следует знак доллара, который обозначает, что все вводимые команды будут выполнены от имени обычного пользователя (знак # будет обозначать, что все команды будут выполнены от имени суперпользователя).

Обращайте внимание на то, от чьего имени запускается та или иная команда - это имеет решающее значение!

Итак, прежде всего переключимся на пользователя postgres (созданного при установке СУБД):

kab18-05@kab1805:~$ sudo -i -u postgres

После этого запустим PostgreSQL и создадим пользователя, попутно задав ему пароль "1234" (обращаем внимание на одинарные кавычки в команде в терминале). Важный момент: я создаю в качестве примера пользователя test, вам нужно создавать собственного пользователя, при этом пароль должен быть достаточно сильным, чтобы одногруппники не "сломали" вашу базу данных (поверьте, некоторые из них просто обожают это делать!). Итак, действуем:

postgres@kab1805:~$psql
postgres=#CREATE USER test WITH PASSWORD '1234';

Выходим из СУБД:

postgres-#\q

Не выходя из учётной записи администратора PostgreSQL (postgres), создадим базу данных (название базы данных, в нашем примере "test", должно совпадать с именем пользователя, созданного в предыдущем шаге, иначе вы не сможете назначить права на эту базу данных своему пользователю):

postgres@kab1805:~$createdb test

Снова входим в СУБД и даём пользователю test все права на базу данных test:

postgres@kab1805:~$psql
postgres=#GRANT ALL PRIVILEGES ON DATABASE test TO test;
postgres=#\q

В 12 и 14 версиях этого было достаточно, а вот в 16 версии попытка создать таблицу в базе данных test пользователем test, который (по идее) имеет все права на неё, выдаст ошибку:

CREATE TABLE json_data_table (data jsonb);
ERROR:  permission denied for schema public
LINE 1: CREATE TABLE json_data_table 
(                     ^

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

postgres=# ALTER DATABASE dg_name OWNER TO user_name;

Добавление второго пользователя с полными правами не приветствуется, однако возможно сделать и это, перебрав все типы разрешённых операций для всех типов объектов базы данных.

Выходим из учётной записи администратора СУБД:

[postgres@kab1805]:~$exit

Входим под учётной записью пользователя test в базу данных test:

kab18-05@kab1805:~$psql -U test -h 127.0.0.1 -p 5432

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

Скрытый текст

Ещё один малозаметный, но немаловажный момент. Команда SQL может занимать несколько строк, при этом её перенос не требует ввода каких-либо спецсимволов. Более того - нажатие клавиши не закончит ввод команды и не передаст управление какой бы то ни было программе. Чтобы сказать системе, что мы ввели всю команду, нужно ввести символ ";" и нажать Enter. Пока точка с запятой не нажата, приглашение к вводу будет незначительно отличаться (вместо знака "равно" будет "минус"):

postgres-#

Если увидите перед знаком "#" знак "-", введя команду полностью, нажмите точку с запятой, и команда будет отправлена на выполнение. Кстати, команду с ошибками, которая была введена ранее, можно отредактировать, не набирая её заново - достаточно стрелками вверх-вниз на клавиатуре пролистать до нужной строки и нажать "Enter". Если команда вводилась в нескольких строках, эту операцию следует повторить (но любой фрагмент также можно и отредактировать при необходимости).

Узнать статус подключения к базе данных можно с помощью команды:

postgres=# \conninfo

Увидим примерно следующее (от версии к версии эта надпись может меняться):

You are connected to database " tester " as user " tester " via socket in "/var/run/postgresql" at port "5432".

Впоследствии мы можем подключиться к базе данных разными способами. Самым простым является запуск терминальной программы psql:

kab18-05@kab1805:~$ psql test

Эта команда подключит базу данных test, если это позволено пользователю СУБД, одноименному текущему пользователю операционной системы. То есть, если в СУБД создан пользователь kab18-05 и ему предоставлены все разрешения на базу данных test, эта команда будет выполнена. В ином случае будет выдано сообщение:

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed:
FATAL:  role "kab18-05" does not exist

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

kab18-05@kab1805~:$ psql

Символ # в конце приглашения к вводу psql обозначает, что вы являетесь суперпользователем, на которого не распространяются никакие ограничения доступа. Такое бывает, когда вы устанавливали в систему экземпляр PosqgreSQL от имени своего пользователя. Символ > говорит о том, что СУБД была запущена от непривилегированного пользователя.

Нужно помнить, что учётные записи пользователя операционной системы и учётные записи пользователей PostgreSQL - не одно и то же. По умолчанию используется имя, с которым вы зарегистрированы в операционной системе. Если с вашей учётной записью в систему входите только вы, имеет смысл при установке и настройке СУБД создать для базы данных пользователя, одноименного с системным. Тогда получится, что в PostgreSQL есть учётная запись с именем, совпадающим с именем системного пользователя, запускающего сервер, и к тому же этот пользователь всегда имеет права на создание баз данных. И чтобы подключиться с именем этого пользователя к PostgreSQL, необязательно входить с этим именем в систему, достаточно везде передавать его с параметром -U. Однако не делайте так на учебных компьютерах в аудитории и в других местах, где под одной и той же учётной записью может работать неограниченное количество пользователей!

Теперь, чтобы убедиться, что всё настроено и работает правильно, после приглашения (# или >) попробуйте такие команды:

test=> SELECT version();
test=> SELECT current_date;
test=> SELECT 2+2;

Для выхода из режима просмотра информации о системе (и тому подобных режимов) нужно нажать клавишу q.

Если вы вдумчиво прочитали этот мануал и повторили на своём компьютере с установленной Ubuntu все указанные действия, поздравляю: у вас имеется установленная СУБД PostgreSQL с созданными для дальнейшей работы пользователями.

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


  1. shirshov79
    22.01.2025 14:33

    Докер проще установить.


  1. outlingo
    22.01.2025 14:33

    В ответ на эту команду система запросит пароль суперпользователя, а получив его

    ... отправит вас лесом. Потому, что sudo спрашивает пароль текущего пользователя, а суперпользователь - root, и его пароль спрашивает su а не sudo

    А что там pg_hba.conf? Не - не слышали. И если вам не повезет - то будет вам птица обломинго вместо входа

    А что там с настройками адреса на котором слушает сервер (а он ведь 127.0.0.1) - тоже никак? Ну тогда и подключиться не удаленно не выйдет.


  1. Samhuawei
    22.01.2025 14:33

    И ни слова про открытие портов и идентификацию удалённого пользователя.


  1. ryanl
    22.01.2025 14:33

    А ещё суффикс service в systemctl командах не обязательно указывать. Так как они предполагаются unit-ами по-умолчанию.


  1. JBFW
    22.01.2025 14:33

    Чтобы юзер не путался в показаниях юзерах ему надо сначала на пальцах обьяснить концепцию юзеров. Чтобы он понял ее, а не запомнил (записал шпаргалку) команды.

    Проблема в том что до кого-то доходит сразу, а кто-то будет тупить "а где баба Галя?"


  1. ashkraba
    22.01.2025 14:33

    Вот уж не ожидал встретить такое в 2025)


  1. turbidit
    22.01.2025 14:33

    Чтобы вернуться в терминал, нажмём Ctrl+Z, это переведёт команду в фоновый режим, но не остановит её выполнение.

    1. Зачем?

    2. С каких пор systemctl status стала интерактивной, а не просто выхлоп в консоль?

    3. Если уж повесили ружьёсвернули, покажите как разворачивать