Перед выполнением задания вы можете ознакомиться с дополнительными материалами.
Используя docker поднимите инстанс MySQL (версию 8). Данные БД сохраните в volume.
Изучите бэкап БД и восстановитесь из него.
Перейдите в управляющую консоль mysql
внутри контейнера.
Используя команду \h
получите список управляющих команд.
Найдите команду для выдачи статуса БД и приведите в ответе из ее вывода версию сервера БД.
Подключитесь к восстановленной БД и получите список таблиц из этой БД.
Приведите в ответе количество записей с price
> 300.
В следующих заданиях мы будем продолжать работу с данным контейнером.
docker exec -it db mysql -uroot -proot
mysql> CREATE DATABASE test_db;
docker exec -it db sh -c 'mysql -uroot -proot test_db < /dump/test_dump.sql'
docker exec -it db mysql -uroot -proot -D test_db
mysql> \s
\s
--------------
mysql Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
...
Server version: 8.0.30 MySQL Community Server - GPL
...
--------------
mysql> SHOW tables;
show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| orders |
+-------------------+
1 row in set (0.01 sec)
mysql> SELECT count(*) FROM orders WHERE price > 300;
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
Создайте пользователя test в БД c паролем test-pass, используя:
- плагин авторизации mysql_native_password
- срок истечения пароля - 180 дней
- количество попыток авторизации - 3
- максимальное количество запросов в час - 100
- аттрибуты пользователя:
- Фамилия "Pretty"
- Имя "James"
Предоставьте привелегии пользователю test
на операции SELECT базы test_db
.
Используя таблицу INFORMATION_SCHEMA.USER_ATTRIBUTES получите данные по пользователю test
и
приведите в ответе к задаче.
Помогла статья https://dev.mysql.com/doc/refman/8.0/en/create-user.html
mysql> CREATE USER 'test'@'localhost'
IDENTIFIED BY 'test-pass'
WITH
MAX_QUERIES_PER_HOUR 100
PASSWORD EXPIRE INTERVAL 180 DAY
FAILED_LOGIN_ATTEMPTS 3
ATTRIBUTE '{"first_name":"James", "last_name":"Pretty"}';
mysql> GRANT Select ON test_db.orders TO 'test'@'localhost';
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES WHERE USER='test';
+------+-----------+------------------------------------------------+
| USER | HOST | ATTRIBUTE |
+------+-----------+------------------------------------------------+
| test | localhost | {"last_name": "Pretty", "first_name": "James"} |
+------+-----------+------------------------------------------------+
1 row in set (0.00 sec)
Установите профилирование SET profiling = 1
.
Изучите вывод профилирования команд SHOW PROFILES;
.
Исследуйте, какой engine
используется в таблице БД test_db
и приведите в ответе.
Измените engine
и приведите время выполнения и запрос на изменения из профайлера в ответе:
- на
MyISAM
- на
InnoDB
mysql> SHOW PROFILES;
Empty set, 1 warning (0.00 sec)
mysql> SELECT TABLE_NAME,ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'test_db';
+------------+--------+
| TABLE_NAME | ENGINE |
+------------+--------+
| orders | InnoDB |
+------------+--------+
1 row in set (0.01 sec)
mysql> SET profiling = 1;
mysql> ALTER TABLE orders ENGINE = MyISAM;
mysql> ALTER TABLE orders ENGINE = InnoDB;
mysql> SHOW PROFILES;
+----------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 0.02720875 | ALTER TABLE orders ENGINE = MyISAM |
| 2 | 0.02925700 | ALTER TABLE orders ENGINE = InnoDB |
+----------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Изучите файл my.cnf
в директории /etc/mysql.
Измените его согласно ТЗ (движок InnoDB):
- Скорость IO важнее сохранности данных
- Нужна компрессия таблиц для экономии места на диске
- Размер буффера с незакомиченными транзакциями 1 Мб
- Буффер кеширования 30% от ОЗУ
- Размер файла логов операций 100 Мб
Приведите в ответе измененный файл my.cnf
.
В такой директории нет такого файла...Поищем в доках расположение...
mysql --help | grep my.cnf
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
А в этой есть /etc/my.cnf
cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
bash-4.4#
Вот получившийся файл my.cnf, в идеале копирнуть нужно туда, но я через volume подменил.