Skip to content

Latest commit

 

History

History

06-db-03-mysql

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Домашнее задание к занятию "6.3. MySQL"

Введение

Перед выполнением задания вы можете ознакомиться с дополнительными материалами.

Задача 1

Используя docker поднимите инстанс MySQL (версию 8). Данные БД сохраните в volume.

Изучите бэкап БД и восстановитесь из него.

Перейдите в управляющую консоль mysql внутри контейнера.

Используя команду \h получите список управляющих команд.

Найдите команду для выдачи статуса БД и приведите в ответе из ее вывода версию сервера БД.

Подключитесь к восстановленной БД и получите список таблиц из этой БД.

Приведите в ответе количество записей с price > 300.

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

docker-compose.yml.

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)

Задача 2

Создайте пользователя 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)

Задача 3

Установите профилирование 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                                                                                                                                                   |
+----------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Задача 4

Изучите файл 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 подменил.