Я использую окна 7 и xampp Я пытаюсь экспортировать мою базу данных, и в процессе преобразования имена таблиц преобразуются в lower case . Я много искал, я знаю, что мне нужно изменить значение lower_case_table_names от 0 до 2 , но где мне нужно изменить это значение, в каком файле?
Выполните следующие действия:
- откройте файл конфигурации MySQL: [диск]xamppmysqlinmy.ini
- искать: # The MySQL server [mysqld]
- добавьте это прямо под ним: lower_case_table_names = 2
- сохранить файл и перезапустить службу MySQL
В linux я не могу установить lower_case_table_names в 2 (он возвращается к 0 ), но я могу установить его на 1 .
Прежде чем изменять этот параметр, выполните полную дамп всех баз данных и удалите все базы данных. Вы не сможете отбросить их после установки lower_case_table_names на 1 , потому что любые прописные буквы в именах баз данных или таблиц не позволят им ссылаться.
Затем установите lower_case_table_names в 1 , перезапустите MySQL и перезагрузите данные, которые преобразуют все в нижний регистр, включая любые последующие запросы.
В MySQL lower_case_table_names Глобальная переменная определяет, сохраняется ли регистр букв при записи имени таблицы на диск, и учитывает ли совпадение имен таблиц регистр. В соответствии с документы :
Если вы используете таблицы InnoDB или MySQL Cluster (NDB), вы должны установить
эта переменная в 1 на всех платформах для преобразования имен в
в нижнем регистре.
Мой сайт на Apache 2.4 с MySQL 5.6.23 и PHP 5.5.25. Большинство моих таблиц — MyISAM, но я хотел бы преобразовать их в InnoDB. В соответствии с директивой выше, я попытался установить lower_case_table_names=1 в конфигурационном файле MySQL. Однако после перезапуска сервера я больше не могу подключиться к базе данных из своего PHP-кода, используя расширение mysqli. Код $this->mysqli = new mysqli($host,$user,$pwd,$db_name,$port); возвращается mysqli->connect_error = «Access denied for user ‘username’@’localhost’ (using password: YES)» , Я уверен, что учетные данные для входа в систему хороши по следующим причинам:
- Вне среды PHP, я могу подключиться к базе данных, используя
те же учетные данные, с помощью удаленного инструмента (SQLyog). - Если я удалю lower_case_table_names=1 строка из файла конфигурации и
перезагрузите сервер, все снова работает.
Во время последовательности запуска сервера MySQL — когда lower_case_table_names=1 — журнал ошибок показывает 3 предупреждения:
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please
use —explicit_defaults_for_timestamp server option (see
documentation for more details). - [Warning] ‘db’ entry ‘%_ldap_ou=addressbook cpldap@localhost’ had
database in mixed case that has been forced to lowercase because
lower_case_table_names is set. It will not be possible to remove this
privilege using REVOKE. - [Warning] ‘db’ entry ‘logaholicdb_host logaholic@localhost’ had
database in mixed case that has been forced to lowercase because
lower_case_table_names is set. It will not be possible to remove this
privilege using REVOKE.
Есть также несколько [Note] записи вошли под обеими конфигами. Когда lower_case_table_names=1 линия удалена, появляется только 1-е предупреждение. Пользователь, получивший отказ в доступе, имеет следующие права доступа к рассматриваемой базе данных (результат SHOW GRANTS FOR ‘username’@’localhost’; )
- Грант использования . TO ‘username’ @ ‘localhost’, ИДЕНТИФИЦИРОВАННЫЙ ПО ПАРОЛЮ ‘* 6DF294D9BAA539074CFC4DD08E77909FE53CFCE1’
- GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ССЫЛКИ, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE
ПОСМОТРЕТЬ, ПОКАЗАТЬ ПОСМОТРЕТЬ, СОЗДАТЬ РУТИНУ, ПОСЛЕ ИЗМЕНЕНИЯ my_db . * TO
«Имя пользователя» @ «локальный»
Почему происходит сбой соединения и как я могу это исправить?
Решение
Шаг 1: Сначала сделайте резервную копию вашей базы данных (все сказки) командой mysqldump.
Шаг 2: Теперь измените настройки вашей конфигурации на нижний регистр.
Шаг 3: Теперь перезапустите службу MySQL.
Шаг 4: Теперь восстановите резервную копию.
При этом все таблицы имен записываются на диск в нижнем регистре по умолчанию, и даже вы можете вызывать их либо в нижнем / верхнем / верблюжьем регистре, но на самом деле они будут храниться на сервере в нижнем регистре.
Другие решения
После дальнейших исследований вот что я нашел.
Проблема взлома моего сайта не была связана с установлением соединения с MySQL. Ошибка, которая ранее не позволила мне получить доступ, была вызвана другой проблемой. Мой сеанс отладки опрашивал базу данных разработки с другими разрешениями на доступ, поэтому при отладке проблемы я думал, что причиной было сбойное соединение — это была проблема с самой отладкой. Что-то еще фактически сломало мой сайт.
В конце концов я понял, что настройка lower_case_table_names=1 кажется, нарушает выполнение SQL-запроса для любой таблицы, имя которой имеет заглавную букву. Например, у меня есть таблица с именем tblCountries , Если я запускаю запрос SELECT * FROM tblCountries MySQL возвращает ошибку tblcountries does not exist , Обратите внимание, что ошибка имеет строчную букву «с».
Запросы к имени таблицы без прописных букв работают нормально: SELECT * FROM user работает потому что имя таблицы ( user ) не имеет прописных букв. Поэтому я попытался переименовать tblCountries в tblcountries с запросом RENAME TABLE ‘tblCountries’ to ‘tblcountries’ но MySQL не удалось с ошибкой Can’t find file: ‘./db_name/tblcountries.frm’ (errno: 2 — No such file or directory) ,
Кажется, что обе эти проблемы предполагают, что сервер вводит все в нижнем регистре перед выполнением запроса. На самом деле, на диске, хотя нет файла tblcountries.frm , файл tblCountries.frm существует вместе с файлами tblCountries.MYD а также tblCountries.MYI , Если я вручную переименую все три файла, заменив ‘C’ на ‘c’, тот же запрос SELECT * FROM tblCountries выполняется успешно.
Так что у меня есть по крайней мере два варианта, но я не знаю, какой из них лучше или есть третий вариант:
1) удалить lower_case_table_names=1 возможность заставить сервер уважать регистр букв при выполнении запросов; затем выполнить RENAME TABLE ‘tblCountries’ to ‘tblcountries’ с каждой таблицы убрать все заглавные буквы; наконец, когда все заглавные буквы были удалены, вставьте заново lower_case_table_names=1 ,
I’ve just compiled the version MySQL 8.0.12 in a Ubuntu 16.0.4.
After following the instructions in the website and making the following my.cnf file:
I get the following error:
What should I change so that data dictionary is aligned to server settings?
5 Answers 5
As per this link, lower_case_table_names should be set together with —initialize option.
I had the same problem and as described here https://bugs.mysql.com/bug.php? >
MySQL Documentation says
lower_case_table_names can only be configured while initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.
To fix this issue,
Just take the backup of the existing db Schema using the following command inside bin folder (/usr/local/mysql/bin) ./mysqldump -uroot -p password > dump.sql
Once the backup is taken delete the existing data folder in Mysql Home(/usr/local/mysql/) using the command rm -rf data
Now add the configuration as «lower_case_table_names=1» in my.cnf under MYSQLD section (/etc/my.cnf)
Now Initialize the data directory using the following command inside bin directory (/usr/local/mysql/bin)
For Secure mode ./mysqld —defaults-file=/etc/my.cnf —initialize —user=mysql —console
For Insecure mode ./mysqld —defaults-file=/etc/my.cnf —initialize-insecure —user=mysql —console
Once the data directory initialized, For Insecure mode repeat the Installation again and For Secure mode use the root password which is initialized during the run time of data directory Initialization.
Now import the existing dump file inside the Mysql Server using the command inside (/usr/local/mysql/bin) directory