Как канонично организовать структуру таблиц в базе данных MySQL? — Хабр Q&A
Добрый день!Меня интересует вопрос того, как правильно организовать структуру таблиц в базе данных MySQL, если с её помощью надо описать следующую условную ситуацию:
Есть некоторое число работников. Работник может работать, а может не работать. Если работник работает, значит должен быть указан завод, на котором он работает, а также цех, в котором он работает.
Есть некоторое число заводов, однако не все из них подразделяются на цеха.
Вопрос: какие должны быть созданы таблицы и какие должны быть связи между ними.
Самое незамысловатое решение, конечно же, это создать таблицу работников:
CREATE TABLE `worker` (
`id` INT UNSIGNED NOT NULL ,
`plant_id` INT NOT NULL,
`department_id` INT NOT NULL
) ENGINE = InnoDB;
таблицу заводов:
CREATE TABLE `plant` (
`id` INT UNSIGNED NOT NULL
) ENGINE = InnoDB;
и таблицу цехов:
CREATE TABLE `department` ( `id` INT UNSIGNED NOT NULL, `plant_id` INT NOT NULL, ) ENGINE = InnoDB;
Однако данное решение содержит ряд неприятных моментов:
- неработающий работник будет содержать в себе plant_id = NULL, department_id = NULL (хотя второе прямо вытекает из первого)
- работник, работающий на заводе, где нет цехов, будет содержать в себе department_id = NULL (хотя, по большому счету, это свойство целого завода, а не конкретного работника)
- работник, работающий на заводе, где есть цеха, буде содержать в себе plant_id = x, department_id = y, а в это же время в таблице department будет id = y, plant_id = x (т.е. будет некоторая избыточность)
И если у цехов разных заводов будут разные свойства, их также не хотелось бы хранить в одной таблице. Как должны быть при этом организованы таблица(-ы) цехов, и как на них должен ссылаться завод и работник?
Спасибо.
Привилегии пользователя MySQL ▷ Права и управление. Как дать права на базу данных MySQL
Базы данных (в т.ч. система MySQL) представляет собой сущность для хранения информации в виде таблиц. Дабы чужие БД не были доступны абсолютному каждому пользователю на сервере, существует система пользователей для этих баз данных. Сам доступ к какой-либо БД может быть назначен администратором (либо уполномоченным пользователем) другому пользователю, причем он может быть полным или в некоторой степени ограниченным. Более конкретно эта степень доступа выражается в привилегиях («правах» или «разрешениях»).
Содержание
Права для пользователей MySQL
Существует некоторое количество привилегий в системе БД MySQL которые указаны ниже с описанием. Последние привилегии являются привилегиями администраторского уровня, что явно указано лишь для справки. Полная информация о правах/ привилегиях доступна в документации разработчика MySQL:
CREATE — позволяет создавать новые базы данных и таблицы
DROP — позволяет удалять базы данных или таблицы
INSERT — позволяет добавлять строки к таблице.
UPDATE — позволяет изменять содержание строк таблиц. Не путать с ALTER, которая позволяет изменять саму структуру таблиц (количество строк/столбцов, типы столбцов).
DELETE — противоположна INSERT — позволяет удалять строки из таблицы.
ALTER — позволяет изменять структуру таблиц. Требует CREATE и INSERT привилегии.
SELECT — позволяет читать (выводит строки) таблицы, используя выборки по столбцам и/или по некоторым арифметическим и логическим критериям.
GRANT OPTION — позволяет назначить конкретные права определенному пользователю (также и отобрать). Возможно дать/отобрать только те права, которыми назначающий сам располагает.
LOCK TABLES
REFERENCES — позволяет создавать связь между таблицами по внешнему ключу.
EVENT — дает право на создание/изменение/удаление заданий для планировщика
TRIGGER — позволяет создавать/изменять/удалять триггеры (привязываемые к определенным таблицам), которые при выполнении операций DELETE, UPDATE или INSERT совершают дополнительные действия.
INDEX — привилегия даёт право добавлять/удалять индексы к (из) таблицам. Сами индексы назначаются вручную, и дают возможность сэкономить время на поиске строк.
CREATE TEMPORARY TABLES — позволяет создавать временные таблицы на время сессии.
CREATE VIEW — позволяет создать некоторое представление в виде таблицы, которая фактически не существует как единая и содержит лишь данные других таблиц. К примеру, в этом представлении можно собрать определенные сгруппированные данные из трёх таблиц (оператором SELECT) и по факту собранные данные будут лишь ссылаться на данные этих 3-х таблиц и также будут объединением, не нуждающимся в собственной таблице.
SHOW VIEW — позволяет проверить каким запросом (из каких данных состоит) создано определенное представление, заданное с помощью CREATE VIEW
CREATE ROUTINE — позволяет создать процедуру, которая является набором заготовленным набором SQL-команд.
ALTER ROUTINE — позволяет изменить процедуру, созданную посредством CREATE ROUTINE.
EXECUTE — позволяет вызывать готовые процедуры.
FILE — предоставляет доступ на чтение любого файла на сервере, к которому есть доступ у самой системы MySQL и доступ на создание файла в директориях, на которые у MySQL есть права записи.
CREATE TABLESPACE (admin) — позволяет создавать/изменять/удалять пространства таблиц. Само это пространство является логическим и не связано со структурой БД или схемой. Оно декларирует расположение объектов БД на физических носителях и используется для оптимизации системы БД.
CREATE USER (admin) — позволяет создавать/изменять/переименовывать/удалять пользователей баз данных.
PROCESS (admin) — разрешает доступ к информации о потоках (процессах) исполняющихся на сервере.
PROXY (admin) — позволяет войти пользователем под видом другого пользователя. Используется администратором для проверки/отладки прав доступа у необходимого пользователя.
RELOAD (admin) — разрешает использование оператора FLUSH, который чистит кеш MySQL
REPLICATION CLIENT
REPLICATION SLAVE (admin) — данная привилегия необходима пользователям ведомого сервера БД, чтобы этот сервер мог подключаться к ведущему серверу в роли ведомого. Без этой привилегии ведомые сервера не смогут запрашивать обновления баз данных и таблиц у ведущего сервера.
SHOW DATABASES (admin) — позволяет выполнять оператор SHOW DATABASES. Пользователи, не имеющие подобной привилегии, при выполнении данного оператора смогут лишь увидеть базы данных к которым у них есть какие-либо права.
SHUTDOWN (admin) — привилегия позволяет выполнить оператор SHUTDOWN, выключающий MySQL сервер.
SUPER (admin) — привилегия, дающая право на множество операций:
- позволяет завершить процессы, принадлежащие другим пользователям
- изменить глобальные системные переменные
- включать/отключать логирование
- производить обновления даже при установленных правах на чтение для системных переменных
- запускать/останавливать репликации на ведомых серверах
- и пр.
ALL (admin) — пользователю, получившему данную привилегию, автоматически назначаются все права в рамках уровня привилегий (возможных привилегий в принципе, согласно контексту выдачи привилегий). Не назначается только привилегия GRANT OPTION в данном случае.
Назначение прав для пользователей MySQL в панелях управления хостингом
- DirectAdmin
- cPanel
- ISPmanager
- Webuzo
DirectAdmin
На главной странице DirectAdmin из под уровня пользователя в меню Your Account переходим в раздел MySQL Management:
Далее нам необходимо перейти в конкретную базу данных, чтобы управлять пользователями, имеющими доступ к ней или создать новую посредством ссылки Create new Database:
Тут мы можем как создать нового пользователя для данной базы путем перехода по Create New Database User, так и привязать к ней существующего,.
На странице привилегий выбираем те привилегии, которые хотим выдать пользователю на конкретную базу данных и сохраняем. Строка состояния напомнит на что и кому выделяются права:
После этого произойдет переход на страницу подтверждения сохранения. Всё, права выданы.
cPanel
На главной странице cPanel нам необходимо найти раздел Базы данных в нем перейти по Базы данных MySQL:
Все манипуляции с базами данных MySQL, пользователями БД и их правами производятся именно в этом меню.
Если у нас нет ни базы, ни пользователя, то создаем их в соответствующих разделах страницы:
Раздел Текущие базы данных обновится:
Создаем пользователя:
Раздел Текущие пользователи обновится:
Для назначения прав определенному пользователю к определенной базе данных нам необходимо найти на странице раздел Добавить пользователя в базу данных и добавить необходимого пользователя к необходимой базе данных:
После добавления пользователя к базе данных откроется диалоговое окно для назначения привилегий:
Кнопка «Все права» эквивалентна привилегии ALL, описанной в начале руководства, и назначит все возможные права пользователю в контексте принадлежности пользователя определенной группе пользователей на уровне всего MySQL сервера.
После подтверждения внесенных изменений будет переадресация на страницу, подтверждающую что указанные права были выданы и на странице управления базами и пользователями MySQL повторно обновится раздел Текущие базы данных:
Готово. Пользователь назначен базе данных.
ISPmanager Lite 5
При входе в ISPmanager в роли какого-либо пользователя необходимо перейти в Инструменты -> Базы данных из левого меню.
Далее на открывшемся интерфейсе управления базами данных необходимо выбрать необходимую базу и перейти в меню Users для перехода к интерфейсу управления пользователями БД. Если же баз данных нет, то создать новую можно перейдя по кнопке Add.
Следует заметить, что при создании новой БД представится возможность сразу создать нового пользователя, который будет назначен к этой базе данных. Либо же можно будет выбрать существующего пользователя, который также будет автоматически назначен этой базе данных.
В интерфейсе управления базой данных нам представится список всех пользователей этой базы данных в текущем аккаунте ISPmanager. Для редактирования прав необходимо выделить конкретного пользователя, которому назначаем права, и перейти в меню Изменить
После этого мы увидим все права, которые можно назначить этому пользователю:
По-умолчанию при создании пользователя и БД назначаются все права. Изменяем те, которые нам необходимо и сохраняем результаты. После этого Вас вернет на страницу управления пользователями баз данных.
Webuzo
Webuzo состоит из 2-х панелей: администраторская и пользовательская. Переходим в пользовательскую панель и на главной странице выбираем Manage Databases
На открывшейся странице мы можем:
- увидеть список существующих баз данных [Database(s)];
- создать новую базу данных [Create Database];
- увидеть список существующих пользователей баз данных [Database User(s)];
- создать пользователя баз данных и назначить его определенной базе данных [Add User To Database]
Если целевой базы данных пока что не существует, то переходим в Create Database и создаем новую базу данных:
Если все же целевая база данных уже существует, то в управлении базами данных нам необходимо перейти в Add User To Database и создать нового пользователя БД или указать какого-либо существующего для его привязки к базе данных:
При добавлении пользователя к базе данных откроется новое окно с запросом назначения прав этому пользователю. Выбираем необходимые нам права и подтверждаем изменения кнопкой Submit Changes.
При успешном изменении прав в текущем окне появится надпись Database Privileges Updated. Задача выполнена.
Системные требования |
||
Windows Microsoft Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10, Server 2008, Server 2012, Server 2016, Server 2019 |
macOS Mac OS X 10.11 El Capitan, macOS 10.12 Sierra, macOS 10.13 High Sierra, macOS 10.14 Mojave, macOS 10.15 Catalina |
Linux Debian 9 и выше, Ubuntu 16.04 и выше, CentOS 7 и выше, Fedora 26 и выше, Linux Mint 18 и выше |
Шпаргалка по командам MySQL ::
Управление пользователямиСписок пользователей
#mysql> SELECT User,Host FROM mysql.user;
#mysql> SHOW GRANTS FOR root@localhost;
#mysql> CREATE USER ‘user’@’localhost’ IDENTIFIED BY ‘secret’;
#mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX ON dbname.* TO ‘user’@’localhost’;
#mysql> GRANT ALL PRIVILEGES ON dbname.* TO ‘user’@’localhost’;
#mysql> REVOKE ALL ON dbname.* FROM ‘user’@’localhost’;
#mysql> FLUSH PRIVILEGES;
#mysqladmin -uroot password ‘secret’
Управление базой данных
Создание базы данных
#mysql> CREATE DATABASE dbname COLLATE utf8_general_ci;
#mysqladmin -u root -p create dbname
#mysqladmin -u root -p drop dbname
Cтатистика
Список всех баз данных
#mysql> SHOW DATABASES;
#mysql> SHOW TABLES;
#mysql> SHOW GLOBAL STATUS;
Оптимизация
При помощи команды mysqlcheck можно выполнять проверку, оптимизацию и исправление ошибок.
Поверка на ошибки БД dbname
#mysqlcheck -p dbname
#mysqlcheck -Aor -p
-p – использовать пароль
-A – проверять все базы данных
-r – ремонтировать БД
-o – оптимизировать БД
Скрипт простой оптимизации БД, можно добавить в крон для выполнение раз в сутки
#mysqlcheck —repair —analyze —optimize —all-databases —auto-repair -u root -pSECRET
#cd /usr/local/bin
#wget http://mysqltuner.pl/mysqltuner.pl
#chmod +x mysqltuner.pl
#/usr/local/bin/mysqltuner.pl
Дамп (резервная копия)
Дамп базы данных
#mysqldump -u root -p dbname > dump.sql
#mysqldump -u root -p -B dbname1 dbname2 > dump.sql
#mysqldump -u root -p -A > dump.sql
#mysqldump -u root -p —no-data dbname > database.sql
—add-drop-table — добавляет команду DROP TABLE перед каждой командой CREATE TABLE
—add-locks — добавляет команду LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы
—no-create-db, -n — не добавлять команду CREATE DATABASE, которая добавляется при использовании параметров —databases и —all-databases
—no-data, -d — дампить только структуру таблиц
—no-create-info, -t — не создавать команду CREATE TABLE
—skip-comments — не выводить комментарии.
—compact — использовать компактный формат
—create-options — добавляет дополнительную информацию о таблице в команду CREATE TABLE: тип, значение AUTO_INCREMENT и т.д. Не нужные опции можно вырезать с помощью sed.
—extended-insert, -e — применение команды INSERT с многострочным синтаксисом (повышает компактность и быстродействие операторов ввода)
—tables — дампить только таблицы из списка, следующего за этим параметром, разделитель — пробел
Применение дампа (импорт)
#mysql -uroot -p dbname1
Определение кодировки файлаfile —mime-encoding dump.sql
Конвертирование из кодировки latin1 в utf8
mysqldump —add-drop-table -uroot -p dbname | replace CHARSET=latin1 CHARSET=utf8 | iconv -f latin1 -t utf8 | mysql -uroot -p dbname
Восстановление root-пароля
#mysqld_safe —skip-grant-tables &
#mysql
#mysql> UPDATE mysql. user SET Password=PASSWORD(‘secret’) WHERE User=’root’;
#mysql> FLUSH PRIVILEGES;
#mysql> \q
#service mysqld restart
Спонсор: Хостинг HostiManУтилита mysqldump и шпаргалка по параметрам / Мастерская интернет-разработчика
7 июня 2009 г. MyISAM MySQL InnoDB Бэкап
Утилита mysqldump позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц.
Так же mysqldump имеет возможность развертывания баз данных из созданного sql-файла.
Создание дампа
Разберем пример простейшее использования, задампим базу данных «database» при помощи перенаправления потока в файл «database.sql»:
mysqldump -uroot -h82.82.82.82 -p database > database.sql
где:
- -u или -–user=… — имя пользователя
- -h или —host=… — удаленный хост (для локального хоста можно опустить этот параметр)
- -p или —password — запросить пароль
- database — имя базы данных
- database. sql — файл для дампа
Для того чтобы сделать дамп несколько баз данных, необходимо использовать параметр —databases (или сокращенно -B), пример:
mysqldump -uroot -h82.82.82.82 -p -B database1 database2 database3 > databases.sql
А для того чтобы сделать дамп всех баз данных, необходимо использовать параметр —all-databases (или сокращенно -A), пример:
mysqldump -uroot -h82.82.82.82 -p -A > all-databases.sql
Развертывание дампа
Перенаправляем поток в обратную сторону и развертываем базу данных:
mysql -uroot -h82.82.82.82 -p database < database.sql
Или через mysql-console:
mysql> use database; mysql> source database.sql
Ну, а если у нас gz-архив к примеру, то:
zcat database.sql.gz | mysql -uroot -h82.82.82.82 -p database
Пример использование некоторых параметров
Например, нам нужны данные с «продакшен версии базы» для «версии разработчика», то есть нам нужна «песочница». Выбираем не более 100 записей:
mysqldump -uroot -h82.82.82.82 -p --where="true limit 100" database > database.sql
Или нам нужна только структура, без данных:
mysqldump -uroot -h82.82.82.82 -p --no-data database > database.sql
Примеры навеяны постом Александра Макарова — http://rmcreative.ru/blog/post/ljogkiy-damp-mysql
Делаем дамп только триггеров, процедур и событий:
mysqldump --no-create-info --no-data --triggers --routines --events -uroot -p database | gzip > ~/database.sql.gz
Шпаргалка по параметрам
Приведу некоторые параметры, которые могут понадобится при работе с утилитой mysqldump.
- —add-drop-database
- Добавляет оператор DROP DATABASE перед каждым оператором CREATE DATABASE.
- —add-drop-table
- Добавляет оператор DROP TABLE перед каждым оператором CREATE TABLE.
- —add-locks
- Добавляет оператор LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы (для ускорения доступа к MySQL).
- —all-databases, -A
- Сохраняет все таблицы из всех баз данных, которые находятся под управлением текущего сервера.
- —allow-keywords
- Разрешить создавать имена столбцов, которые совпадают с ключевыми словами. Отсутствие конфликтов обеспечивается прибавлением имени таблицы в качестве префикса к имени каждого столбца.
- —comments, -i
- Данный параметр позволяет добавить в дамп дополнительную информацию, такую, как версия mysqldump, версия MySQL, имя хоста, на котором расположен сервер MySQL.
- —compact
- Данный параметр требует от mysqldump создать дамп, используя как можно более компактный формат. Параметр является противоположным —comments.
- —compatible=name
- Параметр генерирует вывод, который совместим с другими СУБД или более старыми версиями MySQL. Вместо ключевого слова name можно использовать: «ansi», «mysql323», «mysql40», «postgresql», «oracle», «mssql», «db2», «maxdb», «no_key_options», «no_table_options», «no_field_options». Можно использовать несколько значений, разделив их запятыми.
- —complete-insert, -c
- Используется полная форма оператора INSERT (с именами столбцов).
- —create-options
- Добавляет дополнительную информацию в операторы CREATE TABLE. Это может быть тип таблицы, начальное значение AUTO_INCREMENT и другие параметры.
- —databases, -B
- Параметр позволяет указать имена нескольких баз данных, для которых необходимо создать дамп.
- —delayed
- Использовать команду INSERT DELAYED при вставке строк.
- —delete-master-logs
- На главном сервере репликации автоматически удаляются бинарные логи (logbin) после того, как дамп был успешно создан при помощи mysqldump. Этот параметр автоматически включает параметр «—master-data».
- —disable-keys, -K
- Для каждой таблицы, окружает оператор INSERT выражениями /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; и /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; в выводе результата дампа. Это ускорит загрузку данных на сервер для таблиц типа MyISAM, так как индексы создаются после внесения всех данных.
- —extended-insert, -e
- Использовать команду INSERT с новым многострочным синтаксисом (повышает компактность и быстродействие операторов ввода).
- —flush-logs, -F
- Записать на диск данные системного журнала из буфера MySQL-сервера перед началом выполнения дампа.
- —force, -f
- Продолжать даже если в процессе создания дампа произошла ошибка.
- —hex-blob
- Параметр позволяет представить бинарные данные в полях типа BINARY, VARBINARY, BLOB и BIT в шестнадцатеричном формате. Так последовательность «abc» будет заменена на 0x616263.
- —ignore-table=db_name.tbl_name
- Позволяет игнорировать таблицу tbl_name базы данных db_name при создании дампа. Если из дампа необходимо исключить несколько таблиц, необходимо использовать несколько параметров «—ignore-table», указывая по одной таблице в каждом из параметров.
- —insert-ignore
- Добавляет ключевое слово IGNORE в оператор INSERT.
- —lock-all-tables, -x
- Указание этого параметра приводит к блокировке всех таблиц во всех базах данных на время создания полного дампа всех баз данных.
- —lock-tables, -l
- Указание этого параметра приводит к блокировке таблиц базы данных, для которой создается дамп.
- —no-autocommit
- Включает все операторы INSERT, относящиеся к одной таблице, в одну транзакцию, что приводит к увеличению скорости загрузки данных.
- —no-create-db, -n
- Подавляет создание в дампе операторов CREATE DATABASE, которые автоматически добавляются при использовании параметров —databases и —all-databases.
- —no-data, -d
- Подавляет создание операторов INSERT в дампе, что может быть полезно при создании дампа структуры базы данных без самих данных.
- —opt
- Параметр предназначен для оптимизации скорости резервирования данных и является сокращением, включающим следующие опции: —quick —add-drop-table —add-locks —create-options —disable-keys —extended-insert —lock-tables —set-charset. Начиная с MySQL 4.1, параметр —opt используется по умолчанию, т.е. все вышеперечисленные параметры включаются по умолчанию, даже если они не указываются. Для того чтобы исключить такое поведение, необходимо воспользоваться параметров —skip-opt
- —order-by-primary
- Указание параметра приводит к тому. что каждая таблица сортируется по первичному ключу или первому уникальному индексу.
- —port, -P
- Номер TCP порта, используемого для подключения к хосту.
- —protocol={TCP|SOCKET|PIPE|MEMORY}
- Параметр позволяет задать протокол подключения к серверу.
- —quick, -q
- Позволяет начать формирование дампа, не дожидаясь полной загрузки данных с сервера и экономя тем самым память.
- —quote-names, -Q
- Помещает имена баз данных, таблиц и столбцов в обратные апострофы `. Начиная с MySQL 4.1, данный параметр включен по умолчанию.
- —replace
- Добавляет ключевое слово REPLACE в оператор INSERT. Данный параметр впервые появился в MySQL 5.1.3.
- —result-file=/path/to/file, -r /path/to/file
- Параметр направляет дамп в файл file. Этот параметр особенно удобен в Windows, без использования командной строки. когда можно перенаправить результат в файл при помощи последовательностей > и >>.
- —routines, -R
- Данный параметр создает дамп хранимых процедур и функций. Доступен с MySQL 5.1.2.
- —single-transaction
- Параметр создает дамп в виде одной транзакции.
- —skip-comments
- Данный параметр позволяет подавить вывод в дамп дополнительной информации.
- —socket=/path/to/socket, -S /path/to/socket
- Файл сокета для подсоединения к localhost.
- —tab=/path/, -T /path/
- При использовании этого параметра в каталоге path для каждой таблицы создаются два отдельных файла: tbl_name.sql, содержащий оператор CREATE TABLE, и tbl_name.txt, который содержит данные таблиц, разделенные символом табуляции. Формат данных может быть переопределен явно с помощью параметров —fields-xxx и —lines-xxx.
- —tables
- Перекрывает действия параметра —databases (-B). Все аргументы, следующие за этим параметром, трактуются как имена таблиц.
- —triggers
- Создается дамп триггеров. Этот параметр включен по умолчанию. для его отключения следует использовать параметр —skip-triggers.
- —events, -E
- Создается дамп событий. Смотрите MySQL Event Scheduler или встроенный диспетчер событий в MySQL.
- —tz-utc
- при использовании данного параметра в дамп будет добавлен оператор вида SET TIME_ZONE=’+00:00′, который позволит обмениваться дампа в различных временных зонах.
- —verbose, -v
- Расширенный режим вывода. Вывод более детальной информации о работе программы.
- —version, -V
- Вывести информацию о версии программы.
- —where=’where-condition’, -w ‘where-condition’
- Выполнить дамп только выбранных записей. Обратите внимание, что кавычки обязательны.
- —xml, -X
- Представляет дамп базы данных в виде XML.
- —first-slave, -x
- Блокирует все таблицы во всех базах данных.
- —debug=…, -#
- Отслеживать прохождение программы (для отладки).
- —help
- Вывести справочную информацию и выйти из программы.
Еще пару слов о бекапе в MySQL
mysqlhotcopy для MyISAM
Для быстрого резервирования БД с типом таблиц ISAM и MyISAM можно использовать «mysqlhotcopy», которая скопирует файлы *.frm, *.MYD и *.MYI:
# mysqlhotcopy db_name /path/to/dir
Для InnoDB не подойдет данный способ, потому что при этом типе не обязательно все файлы будут храниться в директории базы данных.
xtrabackup для InnoDB
Для InnoDB есть xtrabackup, рекомендую посмотреть!
UPD: XtraBackup — резервное копирование для innoDB
Бин-лог и репликации
Для репликации «mysqldump» не предназначена, для этого есть бин-лог (—log-bin):
# mysqlbinlog binlog.[0-9]* | mysql
Для полной репликации необходимо вести бин-лог с самого начала работы БД, то есть еще до создания структур и данных.
Резервирование данныс в MySQL 6.x
С версии MySQL 6.x доступен online-backup, вот слайд объясняющий нововведения:
MySQL :: Справочное руководство MySQL 8.0 :: 13.7.7.14 SHOW DATABASES Заявление
13.7.7.14 ПОКАЗАТЬ БАЗЫ ДАННЫХ Заявление
ПОКАЗАТЬ {БАЗЫ ДАННЫХ | СХЕМЫ}
[LIKE ' pattern ' | ГДЕ выражение ]
ПОКАЗАТЬ БАЗЫ ДАННЫХ
перечисляет
базы данных на хосте сервера MySQL. ШОУ
SCHEMAS
является синонимом SHOW.
БАЗЫ ДАННЫХ
. КАК
предложение, если оно присутствует, указывает, какие имена баз данных должны соответствовать.В WHERE Предложение
может использоваться для выбора строк
используя более общие условия, как описано в
Раздел 26.55, «Расширения операторов SHOW».
Вы видите только те базы данных, для которых у вас есть какие-то
привилегия, если у вас нет глобального SHOW
БАЗЫ ДАННЫХ
привилегия. Вы также можете получить этот список, используя
команда mysqlshow .
Если сервер был запущен с --skip-show-database
вариант, вы
не может использовать этот оператор вообще, если у вас нет ПОКАЗАТЬ БАЗЫ ДАННЫХ
привилегия.
MySQL реализует базы данных как каталоги в каталоге данных, поэтому этот оператор просто перечисляет каталоги в этом месте. Однако вывод может включать имена каталогов, которые не соответствуют актуальным базам данных.
Информация о базе данных также доступна на INFORMATION_SCHEMA
SCHEMATA
таблица. Видеть
Раздел 26.31, «Таблица INFORMATION_SCHEMA SCHEMATA».
Осторожность
Поскольку любая статическая глобальная привилегия считается привилегией
для всех баз данных любая статическая глобальная привилегия позволяет пользователю
чтобы увидеть все имена баз данных с SHOW
БАЗЫ ДАННЫХ
или изучив SCHEMATA
таблица INFORMATION_SCHEMA
, кроме баз данных,
были ограничены на уровне базы данных частичными отзывами.
3.5 Использование mysql в пакетном режиме
3.5 Использование mysql в пакетном режиме
В предыдущих разделах вы использовали mysql интерактивно вводить отчеты и просматривать результаты. Ты можешь также запустите mysql в пакетном режиме. Для этого положите операторы, которые вы хотите запустить в файле, а затем сообщите mysql , чтобы прочитать ввод из файла:
оболочка> mysql < командный файл
Если вы используете mysql под Windows и у вас некоторые специальные символы в файле, вызывающие проблемы, вы можете сделай это:
C: \> mysql -e "исходный файл , командный файл "
Если вам нужно указать параметры подключения в командной строке, команда может выглядеть так:
оболочка> mysql -h host -u user -p < batch-file
Введите пароль: ********
Когда вы используете mysql таким образом, вы создаете файл сценария, а затем выполнить сценарий.
Если вы хотите, чтобы сценарий продолжался, даже если некоторые из операторов
в нем возникают ошибки, вы должны использовать --force
параметр командной строки.
Зачем нужен скрипт? Вот несколько причин:
Если вы запускаете запрос несколько раз (скажем, каждый день или каждую неделю), создание сценария позволяет избежать его повторного ввода каждый раз вы выполняете это.
Вы можете генерировать новые запросы из существующих, которые аналогично копированию и редактированию файлов скриптов.
Пакетный режим также может быть полезен при разработке запроса, особенно для многострочных операторов или последовательности из нескольких операторов. Если вы ошиблись, вы этого не сделаете. придется все перепечатать. Просто отредактируйте свой скрипт, чтобы исправить ошибка, затем скажите mysql выполнить ее очередной раз.
Если у вас есть запрос, который дает много результатов, вы можете запустить вывод через пейджер вместо того, чтобы смотреть, как он прокручивается верхняя часть экрана:
оболочка> mysql < командный файл | более
Вы можете записать вывод в файл для дальнейшей обработки:
оболочка> mysql < командный файл > mysql.из
Вы можете распространять свой сценарий среди других людей, чтобы они также можно запускать операторы.
Некоторые ситуации не позволяют интерактивное использование, например, когда вы запускаете запрос из задания cron . В В этом случае вы должны использовать пакетный режим.
Формат вывода по умолчанию отличается (более кратким) при запуске mysql в пакетном режиме, чем когда вы его используете
интерактивно.Например, вывод SELECT DISTINCT
вид ОТ питомца
выглядит так при mysql запускается в интерактивном режиме:
+ --------- +
| виды |
+ --------- +
| птица |
| кошка |
| собака |
| хомяк |
| змея |
+ --------- +
Вместо этого в пакетном режиме результат выглядит так:
видов
птица
Кот
собака
хомяк
змея
Если вы хотите получить интерактивный формат вывода в пакетном режиме, используйте mysql -t .Для вывода на выход выполняемые операторы используйте mysql -v .
Вы также можете использовать сценарии из приглашения mysql с помощью команды source
или \.
команда:
mysql> исходный код filename ;
mysql> \. имя файла
См. Раздел 4.5.1.5, «Выполнение операторов SQL из текстового файла» для получения дополнительной информации.
Список таблиц и их структура с помощью клиента командной строки MySQL
Клиент командной строки MySQL позволяет выполнять запросы sql из интерфейса командной строки.В этом посте рассматривается, как отображать таблицы в конкретной базе данных и описывать их структуру. Это продолжение серии о клиенте командной строки MySQL. Предыдущие сообщения включают использование инструмента командной строки MySQL и выполнение запросов из командной строки MySQL.
После входа в клиент командной строки MySQL и выбора базы данных вы можете вывести список всех таблиц в выбранной базе данных с помощью следующей команды:
mysql> show tables;
(mysql> — это командная строка, а «показать таблицы;» — это фактический запрос в приведенном выше примере).
В настроенной мной тестовой базе данных это возвращает следующее:
+ ---------------- + | Tables_in_test | + ---------------- + | что-то | | something_else | + ---------------- + 2 ряда в наборе (0,00 сек)
Это показывает нам, что в базе данных есть две таблицы, которые называются «something» и «something_else». Мы можем показать структуру таблицы с помощью команды «desc», например, для таблицы «something»:
mysql> desc something;
Моя тестовая таблица базы данных возвращает такой результат, показывающий, что есть 4 столбца и какие они типы и т. Д.:
+ -------------- + -------- ---------- + ------ + ----- + ------------------- + ------ ---------- + | Поле | Тип | Null | Ключ | По умолчанию | Экстра | + -------------- + ------------------ + ------ + ----- + - ----------------- + ---------------- + | something_id | int (10) без знака | НЕТ | PRI | NULL | auto_increment | | имя | варчар (50) | НЕТ | | NULL | | | значение | варчар (50) | НЕТ | | NULL | | | ts_updated | отметка времени | ДА | MUL | CURRENT_TIMESTAMP | | + -------------- + ------------------ + ------ + ----- + - ----------------- + ---------------- + 4 ряда в наборе (0. 00 сек)
Наконец, вы можете показать индексы из конкретной таблицы следующим образом:
mysql> показать ключи от чего-то;
Моя тестовая база данных имеет два индекса (они помечены в столбце «key» из вывода «desc something» выше как PRI и MUL). Результат выполнения приведенной выше команды выглядит следующим образом:
+ ----------- + ------------ + ------------ + -------------- + -------------- + ----------- + ------- ------ + ---------- + -------- + ------ + ------------ + --- ------ + | Стол | Non_unique | Key_name | Seq_in_index | Column_name | Сортировка | Мощность | Под_часть | Упаковано | Null | Index_type | Комментарий | + ----------- + ------------ + ------------ + ----------- --- + -------------- + ----------- + ------------- + ----- ----- + -------- + ------ + ------------ + --------- + | что-то | 0 | ПЕРВИЧНЫЙ | 1 | something_id | А | 2 | NULL | NULL | | BTREE | NULL | | что-то | 1 | ts_updated | 1 | ts_updated | А | NULL | NULL | NULL | | BTREE | NULL | + ----------- + ------------ + ------------ + ----------- --- + -------------- + ----------- + ------------- + ----- ----- + -------- + ------ + ------------ + --------- + 2 ряда в наборе (0.00 сек)
Сводка
Клиент командной строки MySQL полезен для выполнения запросов, а также для отображения таблиц в базе данных MySQL, структуры этих таблиц и индексов в этих таблицах, как описано в этом сообщении.
Как использовать DESCRIBE и EXPLAIN в MySQL?
В MySQL операторы DESCRIBE
и EXPLAIN
являются синонимами, используемыми либо для получения информации о структуре таблицы, либо для планов выполнения запросов.
1.Для описания таблицы:
Несмотря на то, что операторы DESCRIBE
и EXPLAIN
являются синонимами, оператор DESCRIBE
больше используется для получения информации о структуре таблицы, а оператор EXPLAIN
используется для получения плана выполнения запроса.
Оператор DESCRIBE
— это ярлык для оператора SHOW COLUMN
:
эквивалентно этому заявлению SHOW COLUMN
:
ПОКАЗАТЬ КОЛОННЫ ИЗ имя_таблицы;
Или вы также можете использовать краткую форму описания:
Те описывающие операторы, приведенные выше, показывают столбцы в таблице и все их атрибуты, такие как имя, тип данных, сопоставление, возможность нулевого значения, первичный ключ, значение по умолчанию, комментарий и т.
Вместо DESCRIBE или DESC вы можете использовать оператор EXPLAIN, который работает так же:
2. Описание плана выполнения запроса
Мы часто используем EXPLAIN
. Он предоставляет информацию о том, как ваша база данных SQL выполняет запрос.
EXPLAIN
работает с операторами SELECT
, DELETE
, INSERT
, REPLACE
и UPDATE
. Также требуется привилегия SELECT для любых таблиц или представлений, к которым осуществляется доступ, включая любые базовые таблицы представлений.Для представлений EXPLAIN также требует привилегии SHOW VIEW.
EXPLAIN SELECT * FROM имя_таблицы;
На практике оператор EXPLAIN используется для оптимизации запросов. Если у вас медленный запрос, он может показать вам, где следует добавить индексы для ускорения, или проверить, объединяет ли оптимизатор таблицы в оптимальном порядке.
Нужен хороший инструмент с графическим интерфейсом для MySQL? TablePlus — это современный собственный инструмент с элегантным пользовательским интерфейсом, который позволяет одновременно управлять несколькими базами данных, такими как MySQL, PostgreSQL, SQLite, Microsoft SQL Server и другими.
Загрузить TablePlus для Mac . В любом случае это бесплатно!
Не на Mac? Загрузите TablePlus для Windows .
В Linux? Загрузить TablePlus для Linux
Требуется быстрое редактирование на ходу? Скачать TablePlus для iOS .
Как получить структуру базы данных в MySQL с помощью запроса
В следующем примере
детская площадка
— это имя базы данных, аоборудование
— имя таблицы
Другой способ — использовать SHOW-COLUMNS: 5.5 (имеется также для 5.5>
)
$ mysql -uroot -p <пароль> -h <хост> -P <порт> -e \
«ПОКАЗАТЬ КОЛОННЫ ИЗ ДЕТСКОЙ ОБОРУДОВАНИЯ»
А на выходе:
mysql: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным.
+ ------- + ------------- + ------ + ----- + --------- + ---- ------------ +
| Поле | Тип | Null | Ключ | По умолчанию | Экстра |
+ ------- + ------------- + ------ + ----- + --------- + ---- ------------ +
| id | int (11) | НЕТ | PRI | NULL | auto_increment |
| тип | варчар (50) | ДА | | NULL | |
| квант | int (11) | ДА | | NULL | |
| цвет | варчар (25) | ДА | | NULL | |
+ ------- + ------------- + ------ + ----- + --------- + ---- ------------ +
Можно также использовать mysqlshow-client (также доступен для 5.5>
) как показано ниже:
$ mysqlshow -uroot -p <пароль> -h <хост> -P <порт> \
игровое оборудование
А на выходе:
mysqlshow: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным.
База данных: детская площадка Таблица: оборудование
+ ------- + ------------- + ------------------- + ------ + ----- + --------- + ---------------- + ----------------- ---------------- + --------- +
| Поле | Тип | Сортировка | Null | Ключ | По умолчанию | Экстра | Привилегии | Комментарий |
+ ------- + ------------- + ------------------- + ------ + ----- + --------- + ---------------- + ----------------- ---------------- + --------- +
| id | int (11) | | НЕТ | PRI | | auto_increment | выбрать, вставить, обновить, ссылки | |
| тип | варчар (50) | latin1_swedish_ci | ДА | | | | выбрать, вставить, обновить, ссылки | |
| квант | int (11) | | ДА | | | | выбрать, вставить, обновить, ссылки | |
| цвет | варчар (25) | latin1_swedish_ci | ДА | | | | выбрать, вставить, обновить, ссылки | |
+ ------- + ------------- + ------------------- + ------ + ----- + --------- + ---------------- + ----------------- ---------------- + --------- +
Как мне показать схему таблицы в базе данных MySQL?
Как показать схему таблицы в базе данных MySQL? — Переполнение стекаПрисоединяйтесь к Stack Overflow , чтобы учиться, делиться знаниями и строить свою карьеру.
Спросил
Просмотрено 507k раз
Какая команда из консоли MySQL отображает схему любой данной таблицы?
HDJEMAI7,5813939 золотых знаков5959 серебряных знаков8080 бронзовых знаков
Создан 30 сен.
ламблин40.4k1919 золотых знаков9090 серебряных знаков127127 бронзовых знаков
1 описать [db_name.] Table_name;
для форматированного вывода или
показать создать таблицу [db_name.] Table_name;
для оператора SQL, который можно использовать для создания таблицы.
Создан 30 сен.
Омри Ядан25.6k1616 золотых знаков5454 серебряных знака7777 бронзовых знаков
7 ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ yourTable;
или
ПОКАЗАТЬ КОЛОННЫ ИЗ yourTable;
Создан 30 сен.
Бобби, Бобби10.11k55 золотых знаков4141 серебряный знак6767 бронзовых знаков
Вы также можете использовать сокращенное обозначение для описания как desc
для описания таблицы.
desc [db_name.] Table_name;
или
использовать db_name;
desc table_name;
Вы также можете использовать объяснение
для описания таблицы.
объяснение [db_name.] Table_name;
См. Официальный документ
выдаст такой результат:
+ ---------- + ------------- + ------ + ----- + --------- + ------- +
| Поле | Тип | Null | Ключ | По умолчанию | Экстра |
+ ---------- + ------------- + ------ + ----- + --------- + - ------ +
| id | int (10) | НЕТ | PRI | NULL | |
| имя | варчар (20) | ДА | | NULL | |
| возраст | int (10) | ДА | | NULL | |
| секс | варчар (10) | ДА | | NULL | |
| сал | int (10) | ДА | | NULL | |
| расположение | варчар (20) | ДА | | Пуна | |
+ ---------- + ------------- + ------ + ----- + --------- + - ------ +
Создан 27 янв.
Сомнатх Мулук46.3,177 золотых знаков20321 серебряный знак217217 бронзовых знаков
Возможно, здесь следует уточнить вопрос о том, что требуется, потому что может быть прочитан двумя разными способами. т.е.
- Как мне получить структуру / определение таблицы в mysql?
- Как мне узнать имя схемы / базы данных, в которой находится эта таблица?
Учитывая принятый ответ, ОП явно намеревался интерпретировать его первым способом.Для тех, кто читает вопрос по-другому, попробуйте
ВЫБЕРИТЕ `table_schema`
ИЗ `information_schema`.`tables`
ГДЕ `table_name` = 'что угодно';
Создан 10 ноя.
Пол КэмпбеллПол Кэмпбелл1,71222 золотых знака1010 серебряных знаков1717 бронзовых знаков
1 ВЫБЕРИТЕ COLUMN_NAME, TABLE_NAME, table_schema
ОТ INFORMATION_SCHEMA.КОЛОННЫ;
Создан 14 окт.
Ламлам1111 бронзовых знаков
Очень активный вопрос .Заработайте 10 репутации, чтобы ответить на этот вопрос. Требование репутации помогает защитить этот вопрос от спама и отсутствия ответов.lang-sql
Stack Overflow лучше всего работает с включенным JavaScriptВаша конфиденциальность
Нажимая «Принять все файлы cookie», вы соглашаетесь с тем, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Принимать все файлы cookie Настроить параметры
Таблица описания MySQL — javatpoint
ОПИСАТЬ означает показать информацию в деталях.Поскольку у нас есть таблицы в MySQL, мы будем использовать команду DESCRIBE, чтобы показать структуру нашей таблицы , такую как имена столбцов, ограничения на имена столбцов и т. Д. Команда DESC — это краткая форма команды DESCRIBE. Обе команды DESCRIBE и DESC эквивалентны и чувствительны к регистру.
Синтаксис
Ниже приведен синтаксис для отображения структуры таблицы:
{ОПИСАТЬ | DESC} table_name;
Мы можем использовать следующие шаги, чтобы показать все столбцы таблицы :
Шаг 1: Войдите на сервер базы данных MySQL.
Шаг 2: Перейти к определенной базе данных.
Шаг 3: Выполните инструкцию DESCRIBE.
Давайте разберемся с этим на примере, который объясняет, как отображать столбцы таблицы в выбранной базе данных.
Вход в базу данных MySQL
Первый шаг — войти на сервер базы данных, используя имя пользователя и пароль . Мы должны увидеть результат, как показано ниже:
> mysql -u корень -p Введите пароль: ********** mysql>
Перейти к определенной базе данных
Следующим шагом является открытие конкретной базы данных, из которой вы хотите отобразить информацию о таблице, используя следующий запрос.После выполнения запроса мы должны увидеть следующий результат:
mysql> ИСПОЛЬЗУЙТЕ mysqltestdb;
Выполнить DESCRIBE Заявление
Это последний шаг для отображения информации таблицы. Перед выполнением оператора DESCRIBE мы можем дополнительно отобразить все таблицы, хранящиеся в нашей выбранной базе данных, с помощью оператора SHOW TABLES :
mysql> ПОКАЗАТЬ ТАБЛИЦЫ;
Например, , если мы хотим показать структуру таблицы клиентов , выполните приведенный ниже оператор.После успешного выполнения он выдаст результат, как показано ниже:
mysql> ОПИСАТЬ клиента;
Мы также можем использовать на практике оператор DESC, который является сокращением команды DESCRIBE. См. Вывод ниже:
Как отобразить табличную информацию в MySQL Workbench?
Чтобы отобразить информацию о столбцах таблицы в MySQL Workbench, нам сначала нужно запустить инструмент Workbench и войти в систему с именем пользователя и паролем на сервере базы данных MySQL.Получим такой экран:
Теперь выполните следующие действия, чтобы отобразить информацию о таблице:
1. Перейдите на вкладку Navigation и щелкните меню Schema . Здесь мы видим все ранее созданные базы данных. Выберите любую базу данных в меню «Схема», например mysqltestdb . Появятся несколько вариантов, которые могут быть показаны на следующем изображении.
2. Затем щелкните « Tables », в котором показаны все таблицы, хранящиеся в базе данных mysqltestdb.Выберите таблицу, информацию о столбце которой вы хотите отобразить. Затем, указав час мыши на этой таблице, отобразится , три значка . Смотрите изображение ниже:
Теперь щелкните значок (i) , показанный в красном прямоугольном поле. Будет отображено следующее изображение:
Наконец, щелкните меню « Столбцы », чтобы отобразить структуру таблицы.
Команда MySQL SHOW COLUMNS
MySQL также позволяет команде SHOW COLUMNS отображать структуру таблицы.Это более гибкий способ получить информацию о столбцах таблицы.
Синтаксис:
Ниже приведен синтаксис команды SHOW COLUMNS:
mysql> ПОКАЗАТЬ КОЛОННЫ ИЗ имя_таблицы;
Например, , если мы выполним запрос ниже, мы получим информацию обо всех столбцах таблицы в конкретной базе данных:
mysql> ПОКАЗАТЬ КОЛОНКИ ОТ клиента;
Если мы хотим показать информацию о столбцах таблицы из другой базы данных или недоступной в текущей базе данных, мы можем использовать следующий запрос:
mysql> ПОКАЗАТЬ КОЛОННЫ ИЗ имя_базы_данных.table_name; ИЛИ ЖЕ mysql> ПОКАЗАТЬ КОЛОННЫ ИЗ имя_таблицы В имя_базы_данных;
На изображении ниже мы видим, что мы использовали базу данных mysqltestdb. Но мы отобразили информацию о столбце таблицы из другой базы данных без переключения на текущую базу данных.
Если мы хотим отобразить больше информации о столбцах, нам нужно добавить ключевое слово FULL с оператором SHOW TABLES следующим образом:
mysql> ПОКАЗАТЬ ПОЛНЫЕ СТОЛБЦЫ ИЗ имя_таблицы;
Например, , в приведенном ниже запросе SQL перечислены все столбцы таблицы student_info в базе данных mystudentdb :
mysql> ПОКАЗАТЬ ПОЛНЫЕ КОЛОННЫ ОТ student_info;
После выполнения мы видим, что эта команда добавляет столбцы сопоставления , привилегий, по умолчанию и комментариев к набору результатов.
MySQL ОБЪЯСНЕНИЕ
Ключевое слово EXPLAIN является синонимом оператора DESCRIBE, который используется для получения информации о том, как MySQL выполняет запросы . Он может работать с запросами INSERT, SELECT, DELETE, UPDATE и REPLACE. Начиная с MySQL 8.0.19 и более поздних версий, он также может работать с операторами TABLE. Когда мы используем это ключевое слово в запросах, оно обрабатывает инструкцию и предоставляет информацию о том, как таблицы объединяются, о порядке таблицы, предполагаемых разделах и строках.