Журнальный файл
В файл журнала записываются различные записи журнала работы базы данных для выполнения SQL, а также записи журнала ошибок. Файлы журнала в основном включают следующие категории:
- Журнал ошибок: при сбоях базы данных при выполнении определенных операций здесь также будут записываться записанные записи журнала ошибок и предупреждения для определенных операций.
- Двоичный журнал: записывает все операции, которые изменяют базу данных mysql, но не включает операции выбора и отображения, потому что эти два типа не изменяют базу данных.
- Журнал медленных запросов: операторы SQL, которые достигают настраиваемого диапазона медленных запросов mysql, будут записываться в этот журнал, что более полезно для обнаружения трудоемких SQL-запросов.
- Журнал запросов: все записи запросов для mysql будут записаны в этот файл журнала.
Файл журнала ошибок
Ошибка отсутствия файла журнала в экземпляре mysqlзапускать、бегать、неисправностьОн будет записан в любой момент, мы можем проверить расположение записи журнала ошибок следующим образом. Один через вышеизложенноеПуть к файлу журнала ошибок можно найти в файле, а другой можно найти с помощью следующей команды: В этом файле записана неверная информация, мы можем использовать этот файл для поиска проблемы. Если невозможно перезапустить базу данных, поиск файла журнала ошибок может помочь нам решить проблему.
Журнал медленных запросов
В mysql есть динамический параметр long_query_time, который представляет порог медленного запроса, что означает, что, когда выполненный sql превышает время этого параметра, запись будет сохранена в журнале для области медленного запроса данных. Значение по умолчанию равно 10. Следующая команда для просмотра.
В реальной разработке обычно нет sql более 10 секунд, поэтому мы можем установить значение немного меньше, равное 1 секунде, с помощью командыУстановите значение 1 секунда, но функция регистрации медленного запроса по умолчанию отключена. Как показано ниже: по командеВключите эту функцию и, наконец, выполните тест на выполнение SQL:Затем перейдите в каталог datadir mysql, там будет файл медленного запроса выполнить cat + изменить имя файла, вы можете увидеть время выполнения sql и медленного оператора sql: Также путем установкиПараметр, вы также можете получить записи sql, которые не используют индекс в файле.
Журнал запросов
В файл журнала запросов записывается вся информация о работе базы данных mysql, независимо от того, является ли запрос правильным. Местоположение журнала, которое можно просмотреть с помощью следующей команды:
Двоичный журнал
Записывает все операции по изменению базы данных mysql, но не включает、Этот тип, поскольку этот тип не изменяет базу данных, если вы хотите записывать операции выбора и отображения, вы можете использовать толькоЖурнал запросов。
Файлы двоичного журнала в основном выполняют следующие функции:
- Восстановление: для восстановления некоторых данных требуются двоичные файлы.
- Репликация: синхронизируйте данные с другим удаленным MySQL.
- Аудит: используется для определения наличия инъекционной атаки на базу данных.
В mysql двоичный файл существует вВ каталоге, как показано ниже: Бинарный файл не запускается по умолчанию, нам нужно вручную установить параметры для его запуска. Но запуск двоичного файла снизит общую производительность базы данных. Но если база данных не работает в определенный момент, это очень полезно для восстановления данных.
MYSQL, чтобы узнать, включено ли ведение журнала, Если он не включен, вы также можете установить значениеДля просмотра текущего журнала, Место хранения файла журнала также находится вПод содержанием
Подключение к СУБД
Если мы планируем работать в командной строке, заходим в среду управления MySQL.
а) В Linux вводим команду:
mysql -uroot -p
* где root — пользователь, под которым мы будем подключаться к оболочке; ключ -p потребует ввода пароля.
б) В Windows запускаем командную строку — в меню пуск или найдя ее в поиске. Переходим в каталог, с установленной СУБД и запускаем одноименную команду mysql, например:
cd «%ProgramFiles%\MySQL\MySQL Server 5.5\bin\»
* в данном примере предполагается, что у нас установлена MySQL версии 5.5.
mysql -u root -p
* здесь, как и в Linux, идет подключение к mysql/mariadb под учетной записью root с запросом пароля.
Примеры создания дампа MySQL
1. С последующим архивированием
export DBNAME=base
mysqldump -uroot -p ${DBNAME} | gzip > /tmp/${DBNAME}.sql.gz
* в данном примере мы сначала создали переменную DBNAME, в которую внесли значение с именем базы, которую необходимо забэкапить. После выполняем команду mysqldump, результат выполнения которой по конвееру отдаем архиватору gzip. В результате мы получит дамп по пути /tmp/<имя базы>.sql.gz
Или с подробным выводом информации на экран (дольше по времени):
mysqldump -v -uroot -p ${DBNAME} | gzip > /tmp/${DBNAME}.sql.gz
2. Для одновременно нескольких баз
Просто перечисляем имена баз через пробел и добавляем параметр -B
mysqldump -v -uroot -p -B base1 base2 base3 > /tmp/dump_multiply_bases.sql
3. Для всех баз одной командой
Для этого ставим —all-databases, вместо имен баз
mysqldump -v -uroot -p —all-databases > /tmp/dump_all_bases.sql
4. Резервирование только структуры базы
Для уточнения, это создание копии только самих таблиц без данных. Делается добавлением параметра —no-data
mysqldump -v -uroot -p —no-data base1 > /tmp/dump_base1_nodata.sql
5. Создание копии определенной таблицы
Для этого после базы через пробел перечисляем названия таблиц
mysqldump -v -uroot -p base1 table1 table2 > /tmp/dump_base1_tables.sql
6. Резервирование прав доступа на СУБД
Позволяет выгрузить все учетные записи с паролями. Удобно для переноса СУБД на новый сервер без потери доступа к нему.
mysqldump -v -uroot -p mysql user > /tmp/mysql_user.sql
* после восстановления этого дампа, необходимо в sql shell выполнить команду flush privileges;
Возможные ошибки
В процессе восстановления мы можем столкнуться с разными ошибками. Рассмотрим их примеры.
MySQL server has gone away
Во время восстановления базы может выскочить ошибка:
at line xxx: MySQL server has gone away.
Как правило, ее причина в низком значении параметра max_allowed_packet, который отвечает за ограничение выполнения команд из файла. Посмотреть текущее значение можно командой в mysql:
> SHOW VARIABLES LIKE ‘max_allowed_packet’;
Чтобы увеличить значение параметра, открываем конфигурационный файл my.cnf:
vi /etc/my.cnf
* в некоторых версиях СУБД конфиг может находится по пути /etc/my.cnf.d/server.cnf.
В разделе редактируем или добавляем:
…
max_allowed_packet = 512M
* значение для данного параметра не обязательно должно быть таким большим.
Перезапускаем mysql:
systemctl restart mariadb || systemctl restart mysql
Row size too large
Ошибка выскакивает после небольшого времени работы восстановления. Более полный текст выглядит, примерно, так:
ERROR 1118 (42000) at line 608: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Причина: ошибка встречается, если в нашей базе есть большое количество текстовых полей и мы используем таблицы типа INNODB. По умолчанию, они имеют ограничение на объем данных, которые можно хранить в одной строке таблицы.
Решение:
Для решения проблемы мы можем добавить опцию innodb_strict_mode со значением . Данная опция регламентирует более строгий режим работы СУБД. Это грубое решение, которое позволит нам добиться результата, но мы можем выполнить настройку тонко — об этом можно прочитать на соответствующей странице блога mithrandir.ru.
Мы же сделаем все по-быстрому. Открываем конфигурационный файл СУБД — его местоположение зависит от версии и реализации, например:
vi /etc/mysql/mariadb.conf.d/50-server.cnf
* это пример расположения для базы MariaDB 10. Более точное расположение можно найти в файле /etc/my.cnf.
Приводим опцию innodb_strict_mode к виду:
…
innodb_strict_mode = 0
Перезапускаем сервис:
systemctl restart mariadb
* в данном примере мы перезапустили сервис для mariadb.
Выгрузка данных с помощью опции “Lines terminated by”
Вместо того, чтобы все записи были указанны на отдельной строке, вы также можете указать их на той же строке.
В следующем примере, каждая запись отделена символом |.
# cat worker5.txt 100,Andreyex,Sales,5000|200,Boris,IT,5500|300,Anna,IT,7000|400,Anton,Marketing,9500|500,Dima,IT,6000
Чтобы загрузить вышеуказанный файл, используйте вариант, как показано ниже.
LOAD DATA INFILE 'worker5.txt' INTO TABLE employee FIELDS TERMINATED BY ',' LINES TERMINATED BY '|';
Приведенная выше команда будет загружать записи из worker5.txt, как показано ниже.
MariaDB > select * from employee; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andreyex | Sales | 5000 | | 200 | Boris | IT | 5500 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | | 500 | Dima | IT | 6000 | +-----+--------+------------+--------+
Ниже приведены несколько моментов, чтобы иметь в виду:
- Если входной файл поступает из окна, то вы можете использовать эту функцию: LINES TERMINATED BY ‘\r\n’
- Если вы используете CSV файл для загрузки данных в таблицу, то попробуйте одну из этих: 1) LINES TERMINATED BY ‘\r’ 2) LINES TERMINATED BY ‘\r\n’
Повторить файл журнала
По умолчанию в mysqlБудетс участиемДва файла, эти два файлаПовторить файл журнала. Запись файла журнала повторов предназначена для транзакции ACID в базе данных.C (консистенция) Предусмотрена охрана. В каждом движке хранилища innodb будет как минимум два файла журнала повторного выполнения.
Размер каждого файла журнала повторного выполнения одинаков, ациклЖурнал ведется таким образом, что при заполнении файла ib_logfile0 происходит переключение на файл журнала ib_logfile1.
Функция файла журнала повторного выполнения такая же, как и у двоичного файла журнала. Это файл, который записывает журнал транзакций. Итак, в чем разница между двоичным файлом и файлом журнала повторного выполнения?
- Двоичный файл предназначен для записи всех файлов журнала, связанных с базой данных mysql, и диапазон записи шире, чем файл журнала повторного выполнения.
- Двоичные файлы сбрасываются на диск только после подтверждения транзакции. Пока транзакция выполняется, журнал повторов будет постоянно записываться на диск,
Журналы повторного выполнения не записываются непосредственно на диск, а сначала записываются в журнал буфера повторного выполнения, и для запуска записи требуются определенные условия. Запуск записи журнала повторного буфера на диск, один из которых является основным потоком, Журналы повторов сбрасываются на диск каждую секунду.
Другой — управление путем передачи параметра innodb_flush_log_at_trx_commit. Параметры: 0, 1, 2, где 0 означает, что журнал повторов не будет сброшен на диск при фиксации транзакции, а основной поток должен инициировать вывод журнала на диск.
1 означает, что журнал в буфере будет выведен на диск при фиксации транзакции. Поэтому установите значение 1 для надежности и согласованности транзакции. Когда возникает исключение, требуется восстановление данных, вы можете просмотреть журнал повторов и объединить двоичный файл журнала для восстановления данных. Убедитесь, что данные не будут потеряны.
InnoDB
В MySQL 8 подсистема хранения данных InnoDB используется по умолчанию и является наиболее широко применяемой из всех других доступных подсистем хранения. Подсистема InnoDB была выпущена вместе с MySQL 5.1 как плагин в 2008 году, и она рассматривается как подсистема хранения по умолчанию, начиная с версии 5.5 и выше. Поддержка подсистемы хранения InnoDB была перенята корпорацией Oracle в октябре 2005 года у финской компании Innobase Oy.
Таблицы InnoDB поддерживают ACID-совместимые фиксации транзакций, откат и возможности аварийного восстановления для защиты пользовательских данных. InnoDB также поддерживает блокировку на уровне строк, что помогает улучшить параллелизм и производительность. InnoDB хранит данные в кластеризованных индексах, чтобы уменьшить операции ввода-вывода для всех запросов SQL на выборку данных на основе первичного ключа. InnoDB также поддерживает ограничения внешнего ключа, которые обеспечивают лучшую целостность данных в базе данных. Максимальный размер таблицы InnoDB может масштабироваться до 256 Тб, что должно быть вполне достаточным во многих случаях использования больших данных.
Важные замечания по InnoDB
Выполнение простого запроса, такого как , без наличия индексов будет очень медленным, поскольку, для того чтобы получить данные, он выполняет полное сканирование таблицы. Если вы хотите часто применять запрос на количество данных к таблице InnoDB, предлагается создавать триггеры на операции вставки и удаления, после чего можно увеличивать или уменьшать счетчики, когда записи вставляются или удаляются, что может помочь вам достигнуть лучшей производительности.
InnoDB — это подсистема хранения данных с мультиверсионным управлением параллелизмом (MVCC), которая хранит информацию о старых версиях измененных строк, чтобы поддержать функционал транзакций и отката, что оказывается весьма кстати в целях поддержания целостности данных или в случаях аварийного прекращения работы.
Для оптимизации производительности таблицы InnoDB ниже приведено несколько параметров, которые мы можем использовать в настройках . Однако они зависят от вашей среды и баз данных.
- : определяет максимальное количество файлов, которые она может держать открытыми при работе с режимом .
- : задает размер пула в памяти, который может использоваться для кеширования индексов и табличных данных. Это один из важных аспектов настройки таблиц InnoDB. Это значение можно увеличить в зависимости от размера оперативной памяти на сервере.
- : этот параметр используется для нескольких параллельных потоков, которые будут использоваться для обработки запроса и зависят от числа доступных ЦП.
Получить двоичный журнал с удаленного сервера
С вашего локального компьютера вы также можете прочитать бинарные журналы mysql, расположенные на удаленном сервере.
Для этого вам необходимо указать IP-адрес, имя пользователя и пароль для удаленного сервера, как описано ниже.
Используйте для этого вариант -R. Параметр -R аналогичен -read-from-remote-server.
mysqlbinlog -R -h 192.168.101.2 -p mysqld-bin.000001
В приведенном выше:
- Параметр -R указывает команде mysqlbinlog считывать файл журнала с удаленного сервера
- -h указать ip-адрес удаленного сервера
- -p даст вам пароль. По умолчанию он будет использовать «root» в качестве имени пользователя. Вы также можете указать имя пользователя, используя опцию -u.
- mysqld-bin.000001 Это имя бинарного файла журнала с удаленного сервера, который мы здесь читаем.
Следующая команда точно такая же, как приведенная выше команда:
mysqlbinlog --read-from-remote-server --host = 192.168.101.2 -p mysqld-bin.000001
Ниже приводится частичный вывод указанной выше команды:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #170726 13:57:37 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.73-log created 170726 13:57:37 at startup ROLLBACK/*!*/; BINLOG ' IeZ4WQ8BAAAAZgAAAGoAAAAAAAQANS4xLjczLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAh5nhZEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/; # at 106 #170726 13:59:31 server id 1 end_log_pos 182 Query thread_id=2 exec_time=0 error_code=0 .. DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
Если вы укажете только параметр -h, вы получите следующее сообщение об ошибке.
# mysqlbinlog -h 192.168.101.2 mysqld-bin.000001 mysqlbinlog: File 'mysqld-bin.000001' not found (Errcode: 2)
Если у вас недостаточно прав для удаленной базы данных, вы получите сообщение об ошибке “is not allowed to connect”. В этом случае убедитесь, что вы предоставили правильные привилегии в удаленной базе данных для своего локального клиента (т. е. когда запущена команда mysqlbinlog)
# mysqlbinlog -R --host=192.168.101.2 mysqld-bin.000001 ERROR: Failed on connect: Host '216.172.166.27' is not allowed to connect to this MySQL server
Если вы не укажете правильный пароль с помощью параметра -p, вы получите следующее сообщение об ошибке «access denied»
# mysqlbinlog -R --host=192.168.101.2 mysqld-bin.000001 ERROR: Failed on connect: Access denied for user 'root'@'216.172.166.27' (using password: YES)
В следующем примере показано, что вы также можете использовать опцию -u для указания имени пользователя, которое должен использовать mysqlbinlog для подключения к удаленной базе данных MySQL. Обратите внимание, что этот пользователь является пользователем mysql (а не пользователем Linux-сервера)
mysqlbinlog -R --host = 192.168.101.2 -u root -p mysqld-bin.000001
3: Извлечение и визуализация данных из БД MySQL
Имея в базе данных информацию и изображения товаров, вы можете написать второй сценарий PHP, который будет запрашивать и отображать данные в таблице HTML в браузере.
Чтобы создать файл, введите:
Затем вставьте в файл следующее:
Сохраните изменения в файле и закройте его.
Мы снова сослались на файл config.php для подключения к базе данных. Затем мы с помощью PDO создали и выполнили оператор SQL для извлечения всех элементов из таблицы; это делается при помощи команды SELECT * FROM products.
Затем мы создали таблицу HTML и заполнили ее данными о товарах с помощью PHP-оператора while() {…}. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) запрашивает БД и сохраняет результат в переменной $row в виде многомерного массива, который затем отображается в столбце таблицы HTML с помощью $row.
Изображения из столбца product_image заключены в теги <img src = “”>. Мы задали атрибуты ширины и высоты, чтобы уменьшить размер изображений (иначе бы они не поместились в столбце таблицы HTML).
Чтобы преобразовать данные, содержащиеся в типе BLOB, обратно в изображения, мы использовали встроенную PHP функцию base64_encode и следующий синтаксис для :
В этом случае image/png – это media_type, а строка в кодировке Base64 из столбца product_image – это base_64_encoded_data.
Запустите файл display_products.php в веб-браузере:
После запуска файла display_products.php вы увидите в браузере HTML-таблицу со списком товаров и их изображениями.
Это значит, что наш сценарий PHP правильно извлекает и визуализирует изображения и другие данные MySQL.
ПРЕДУПРЕЖДЕНИЕ (или ОПАСНОСТЬ как робот сказал бы в Затерянном космосе )
Если вы думаете просто о копировании файлов .frm и .ibd, вы стоите в очереди на мир причинения вреда. Копирование файлов .frm и .ibd таблицы InnoDB является хорошим тогда и только тогда, когда вы можете гарантировать, что идентификатор табличного пространства файла .ibd точно совпадает с идентификатором табличного пространства запись в метаданных файла ibdata1.
Я написал два сообщения в DBA StackExchange об этой концепции идентификатора табличного пространства
- (под заголовком «Восстановление баз данных»)
Вот отличная ссылка о том, как заново присоединить любой файл .ibd к ibdata1 в случае несовпадения идентификаторов табличного пространства: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in- файл . Прочитав это, вы должны сразу же понять, что копировать файлы .ibd просто безумие.
Для InnoDB, вам нужно только что-то это переместить
сделать копию таблицы InnoDB.
Если вы переносите его на другой сервер БД, используйте mysqldump.
Что касается смешивания всех таблиц InnoDB из всех баз данных, я действительно вижу мудрость в этом. В моей компании, занимающейся базой данных и веб-хостингом, у меня есть один клиент MySQL, у которого есть таблица в одной базе данных, чьи ограничения отображаются на другую таблицу в другой базе данных в том же экземпляре MySQL. Благодаря единому хранилищу метаданных он обеспечивает поддержку транзакций и работоспособность MVCC в нескольких базах данных.
Что может храниться в MySQL
В MySQL может храниться что угодно, если вы можете настроить связи между данными. Вы можете хранить в такой базе заметки, фото, музыку, списки дел, задачи на год и все лекции по теории вероятности. Весь вопрос в том, чтобы вы понимали, как вы будете это использовать дальше.
Например, все наши статьи в «Коде» хранятся в MySQL-базе, с которой мы работаем через Вордпресс. Там же есть информация и об авторах, и о картинках для статей, о дате публикации и о многом другом. Чтобы вы прочитали эту статью, сайт обратился к базе данных, взял оттуда статью, правильно её обработал и показал вам.
Другие используют MySQL для работы с клиентской базой — в бизнесе, поликлиниках или системах учёта товаров.
Самой базе всё равно, что в ней хранится и как вы этим пользуетесь. База данных — это просто способ связать данные вместе, а потом найти в них то, что нужно.
Составные индексы
Рассмотрим такой запрос:
SELECT * FROM users WHERE age = 29 AND gender = 'male'
Нам следует создать составной индекс на обе колонки:
CREATE INDEX age_gender ON users(age, gender);
Устройство составного индекса
Чтобы правильно использовать составные индексы, необходимо понять структуру их хранения. Все работает точно так же, как и для обычного индекса. Но для значений используются значения всех входящих колонок сразу. Для таблицы с такими данными:
id | name | age | gender 1 | Den | 29 | male 2 | Alyona | 15 | female 3 | Putin | 89 | tsar 4 | Petro | 12 | male
значения составного индекса будут такими:
age_gender 12male 15female 29male 89tsar
Это означает, что очередность колонок в индексе будет играть большую роль. Обычно колонки, которые используются в условиях WHERE, следует ставить в начало индекса. Колонки из ORDER BY — в конец.
Поиск по диапазону
Представим, что наш запрос будет использовать не сравнение, а поиск по диапазону:
SELECT * FROM users WHERE age <= 29 AND gender = 'male'
Тогда MySQL не сможет использовать полный индекс, т.к. значения gender будут отличаться для разных значений колонки age. В этом случае база данных попытается использовать часть индекса (только age), чтобы выполнить этот запрос:
age_gender 12male 15female 29male 89tsar
Сначала будут отфильтрованы все данные, которые подходят под условие age <= 29. Затем, поиск по значению “male” будет произведен без использования индекса.
Сортировка
Составные индексы также можно использовать, если выполняется сортировка:
SELECT * FROM users WHERE gender = 'male' ORDER BY age
В этом случае нам нужно будет создать индекс в другом порядке, т.к. сортировка (ORDER) происходит после фильтрации (WHERE):
CREATE INDEX gender_age ON users(gender, age);
Такой порядок колонок в индексе позволит выполнить фильтрацию по первой части индекса, а затем отсортировать результат по второй.
Колонок в индексе может быть больше, если требуется:
SELECT * FROM users WHERE gender = 'male' AND country = 'UA' ORDER BY age, register_time
В этом случае следует создать такой индекс:
CREATE INDEX gender_country_age_register ON users(gender, country, age, register_time);
Загрузить только определенные столбцы (и игнорировать другие) при загрузки из файла
В следующем примере мы имеем значения только для трех полей. У нас нет столбца department в этом примере файла.
# cat worker8.txt 100,Andreyex,5000 200,Boris,5500 300,Anna,7000 400,Anton,9500 500,Dima,6000
Для того, чтобы загрузить значения из входной записи на определенный столбец в таблице, укажите имена столбцов во время загрузки данных INFILE, как показано ниже. В последней строке в следующей команде есть имена столбцов, которые должны использоваться для загрузки записей из входного текстового файла.
LOAD DATA INFILE 'worker8.txt' INTO TABLE employee FIELDS TERMINATED BY ',' (id, name, salary);
Так как мы не указываем колонку “DEPT” в приведенной выше команде, мы увидим, что этот столбец NULL, как показано ниже.
MariaDB > select * from employee; +-----+--------+------+--------+ | id | name | dept | salary | +-----+--------+------+--------+ | 100 | Andreyex | NULL | 5000 | | 200 | Boris | NULL | 5500 | | 300 | Anna | NULL | 7000 | | 400 | Anton | NULL | 9500 | | 500 | Dima | NULL | 6000 | +-----+--------+------+--------+
Опять же, имейте в виду, что, когда вы не указываете список столбцов, то команда будет ожидать, что все столбцы должны присутствовать в файле ввода.
Кроме того, если вы не указали список столбцов в последней строке, вы получите ошибку синтаксиса, как показано ниже.
MariaDB > LOAD DATA INFILE 'worker7.txt' -> INTO TABLE employee (id, name, salary) -> FIELDS TERMINATED BY ','; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FIELDS TERMINATED BY ','' at line 3
Системное табличное пространство ibdata1
Все метаданные для db1.mytable все еще находятся в ibdata1 и это абсолютно невозможно. Журналы повторов и данные MVCC также все еще живут с ibdata1.
Когда дело доходит до фрагментации таблицы, вот что происходит с ibdata1:
- включено : вы можете уменьшить db1.mytables с помощью или . Это приводит к тому, что /var/lib/mysql/db1/mytable.ibd физически меньше без фрагментации.
- отключено : вы не можете сжать db1.mytables с помощью или потому что он находится в ibdata1. Фактически, запустив любую команду, вы сделаете таблицу смежной и быстрее будете читать и писать. К сожалению, это происходит в конце ibdata1. Это заставляет ibdata1 быстро расти. Об этом полностью говорится в моем сообщении по очистке InnoDB .
Определение Параметров конфигурации InnoDB
Выборка файл для маленьких
систем. Предположите, что у Вас есть компьютер с RAM 512 МБ и одним жестким диском. Следующий
пример показывает возможные параметры конфигурации в или для , включая
атрибут. Пример подходит большинству пользователей, и на Unix и на Windows, кто не хочет распределять файлы данных и файлы журнала на несколько дисков. Это создает
авторасширяющийся файл данных и два
файлы журнала и в каталоге
данных MySQL.
# You can write your other MySQL server options here# ...# Data files must be able to hold your data and indexes.# Make sure that you have enough free disk space.innodb_data_file_path = ibdata1:12M:autoextend## Set buffer pool size to 50-80% of your computer's memoryinnodb_buffer_pool_size=256Minnodb_additional_mem_pool_size=20M## Set the log file size to about 25% of the buffer pool sizeinnodb_log_file_size=64Minnodb_log_buffer_size=8M#innodb_flush_log_at_trx_commit=1
Отметьте, что файлы данных должны составить меньше чем 2 Гбайт в некоторых файловых системах. Объединенный
размер файлов журнала может составить до 512 Гбайт. Объединенный размер файлов данных должен быть, по крайней
мере, немного больше чем 10 МБ.
Запись Shell Скрипт для загрузки данных из текстового файла
Иногда вы можете загрузить данные из текстового файла автоматически, без необходимости входа в MySQL каждый раз.
Скажем, мы хотим поставить следующую команду внутри сценария оболочки и выполнить это автоматически для базе данных andreyexbase.
LOAD DATA INFILE 'worker2.txt' INTO TABLE employee FIELDS TERMINATED BY ','
Чтобы выполнить загрузку из командной строки, вы можете использовать опцию -e в команде mysql и выполнить его из строки Linux, как показано ниже.
# mysql -e "LOAD DATA INFILE 'employee2.txt' INTO TABLE employee FIELDS TERMINATED BY ','" \ -u root -pMySQLPassword andreyexbase
Или, вы можете положить, внутри сценария оболочки, как показано ниже. В этом примере сценарий оболочки loads-data.sh имеет указанную выше команду MySQL.
# cat loads-data.sh mysql -e "\ LOAD DATA INFILE 'worker2.txt'\ INTO TABLE employee \ FIELDS TERMINATED BY ','\ " \ -u root -pMySQLPwd4MDN! test
Дайте разрешение на выполнение на этот скрипт loads-data.sh, и выполните его из командной строки, которая будет загружать данные автоматически в таблицу. Можно также запланировать это как cronjob для загрузки данных из файла автоматически в таблицу на запланированный интервал.
# chmod u+x loads-data.sh # ./loads-data.sh
А покажите сами запросы
А пожалуйста.
Создадим базу данных THECODE_MEDIA:
Скажем, что будем дальше работать именно с этой базой:
Создадим таблицу с названиями статей, авторами и количеством прочтений за месяц:
Загрузим в таблицу уже готовые данные из файла:
А теперь выведем их на экран:
Команд в SQL настолько много, что нам понадобится отдельная статья для практики. Сделаем для этого отдельный проект, на котором покажем, как MySQL работает с запросами и таблицами.
Работа с MySQL через запросы в терминале
Коротко главное
- MySQL — система управления реляционными базами данных. Реляционными — то есть такими, между которыми есть однозначные прописанные связи. Можно представить, что это система управления табличными базами данных.
- Таблицы могут быть связаны между собой, чтобы можно было проще найти нужную информацию.
- Для работы с реляционными БД используют специальный язык — SQL.
- Каждая команда в SQL — это запрос к базе, чтобы она что-то нашла, изменила, добавила или удалила у себя.
- MySQL используют уже 25 лет, поэтому это проверенная и надёжная база данных. Кто любит MySQL, тому легко ориентироваться в технологиях современного веба.
Что дальше
На очереди — нереляционные базы и NoSQL. Там вообще всё не так, как здесь, поэтому разбирать будем отдельно.
Текст и иллюстрации
Миша Полянин
Редактор
Максим Ильяхов
Корректор
Ира Михеева
Иллюстратор
Даня Берковский
Вёрстка
Маша Дронова
Игнорировать строки заголовка при загрузки из файла
В следующем входном текстовом файле, первая строка является строкой заголовка, который имеет название столбцов.
# cat worker7.txt empid,name,department,salary 100,Andreyex,Sales,5000 200,Boris,IT,5500 300,Anna,IT,7000 400,Anton,Marketing,9500 500,Dima,IT,6000
Во время загрузки, мы хотим, игнорировать 1-й строку заголовка из файла worker7.txt. Для этого используйте опцию IGNORE 1, как показано ниже.
LOAD DATA INFILE 'worker7.txt' INTO TABLE employee FIELDS TERMINATED BY ',' IGNORE 1 LINES;
Как видно из следующих выходных данных, даже если входной файл имеет 6 строк, он игнорирует 1-ю линию (которая является строка заголовка) и загрузит оставшиеся 5 строк.
Query OK, 5 rows affected (0.00 sec) Records: 5 Deleted: 0 Skipped: 0 Warnings: 0 MariaDB > select * from employee; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andreyex | Sales | 5000 | | 200 | Boris | IT | 5500 | | 300 | Anna | IT | 7000 | | 400 | Anton | Marketing | 9500 | | 500 | Dima | IT | 6000 | +-----+--------+------------+--------+
Шаг 3 — Отображение информации о продуктах из базы данных MySQL
Мы разместили в базе данных информацию о продуктах и их ихображения. Теперь мы создадим еще один скрипт PHP, который будет запрашивать и выводить информацию о продуктах в таблице HTML в браузере.
Для создания файла введите следующее:
Затем введите в файл следующую информацию:
/var/www/html/display_products.php
Сохраните изменения в файле и закройте его.
Здесь мы опять использовали файл для подключения к базе данных. Затем мы подготовили и выполнили команду SQL, используя PDO для извлечения всех элементов из таблицы с помощью команды .
Затем мы создали таблицу HTML и заполнили ее данными о продуктах, используя выражение PHP . Строка отправляет запрос в базу данных и сохраняет результат в переменной как многомерный массив, который затем отображается как столбец таблицы HTML с использованием синтаксиса .
Изображения из столбца заключены в теги . Мы использовали атрибуты и для уменьшения ширины и высоты изображений, чтобы они поместились в столбце таблицы HTML.
Чтобы конвертировать данные, хранящиеся в объекте типа , обратно в изображения, мы использовали встроенную функцию PHP и следующий синтаксис :
В данном случае — это значение параметра (тип файла), а закодированная строка из столбца — это данные .
Выполните в браузере файл , введя следующий адрес:
Запустив в браузере файл , вы увидите таблицу HTML со списком продуктов и связанных с ними изображений.
Это подтверждает, что скрипт PHP для извлечения изображений из базы данных MySQL работает ожидаемым образом.
1: Создание базы данных
Давайте начнем с создания тестовой базы данных для этого проекта. Подключитесь к серверу по SSH, а затем выполните следующую команду, чтобы войти на сервер MySQL как пользователь root:
Введите root-пароль базы данных MySQL и нажмите Enter, чтобы продолжить.
После этого выполните следующую команду, чтобы создать базу данных. В этом руководстве мы назовем ее test_company:
После создания БД вы увидите следующее:
Теперь нам нужно создать на сервере MySQL учетную запись test_user; не забудьте заменить PASSWORD сложным паролем:
Вы получите следующий результат:
Query OK, 0 rows affected (0.01 sec)
Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, запустите команду:
Вы должны получить следующий результат:
В завершение нужно сбросить таблицы привилегий, чтобы MySQL перезагрузил права:
На экране должно появиться:
Теперь, когда база данных test_company и пользователь test_user готовы, мы можем перейти к созданию таблицы. Предположим, нам нужна таблица products для хранения списка товаров. Позже мы попробуем вставить и извлечь данные из этой таблицы, чтобы понять, как работает BLOB в MySQL.
Выйдите из оболочки MySQL:
Затем снова войдите в систему, на этот раз – как пользователь test_user:
При появлении запроса введите пароль test_user и нажмите Enter, чтобы продолжить. Затем откройте базу данных test_company, набрав команду:
Перейдя в базу данных test_company, MySQL отобразит такой результат:
Затем создайте таблицу products:
Эта команда создаст таблицу по имени products. В таблице будет четыре столбца:
Для поддержки широкого спектра функций, включая транзакции MySQL, мы использовали механизм InnoDB. Выполнив вышеприведенную команду для создания таблицы, вы увидите следующий результат:
Выйдите из сервера MySQL:
Вы получите сообщение:
Таблица products готова. Вы можете использовать ее для хранения некоторых записей, включая изображения продуктов. Скоро мы заполним ее данными.
подводить итоги
1. Создайте структуру таблицы (используйте ее напрямую с резервным копированием, пропустите первый шаг для получения структуры таблицы)
2. Удалите вновь созданное табличное пространство.
3. Скопируйте файл данных .ibd, чтобы перезаписать вновь созданный файл.
4. Импортируйте табличное пространство.
Следующий контент не имеет ничего общего с технологиями (тело — столица революции, вы не можете использовать свою жизнь за деньги):
Сегодняшний кулинарный опыт
При запекании картофеля с жареной свининой мясо следует разрезать по текстуре (иначе оно легко сломается), а при обжиге можно добавить более легкий соевый соус (экстракт фреш), но соевый соус не должен превышать половину лопатки (иначе он станет углеродом) .Это влияет на аппетит каждого.