Установка таблиц MySQL по умолчанию в Windows (mysql_install_db)


12

В Linux таблицы грантов MySQL по умолчанию могут быть созданы с помощью mysql_install_dbскрипта, но это не работает в Windows.

Как можно установить таблицы грантов по умолчанию в Windows?

(Нет, я не ищу ответа о том, что в результатах Google полно информации о том, как они автоматически устанавливаются в Windows, поскольку это касается только дистрибутива установщика, а не пакета ZIP. Кроме того, это не помогает после MySQL установлен и каталог данных поврежден или заменяется, или что-то в этом роде.)

Ответы:


13

Я знал, что сталкивался с этим раньше и сумел выяснить это, поэтому я искал свои диски и нашел пакетный файл, который написал в прошлый раз.

Для всех, кто сталкивается с этой проблемой, вам нужно запустить демон сервера с --bootstrapпараметрами.

Вот сценарий, который я использовал, чтобы выгрузить все базы данных в файл SQL и повторно импортировать их (то есть вручную - и неудобно - реализовать аналог MySQL для команды SQLite vacuum).

::Start the server, change to the MySQL bin directory, and dump all databases
net start MySQL
cd       /d "%serverdir%\MySQL\bin"
mysqldump  -uroot -p --all-tablespaces --all-databases --add-drop-database --add-drop-table --add-locks --comments --complete-insert --compress --create-options --events --routines --quick --quote-names --set-charset --triggers > %temp%\all.sql

::Stop the server and rename the data directory (as backup)
net stop mysql
ren         "%datadir%\MySQL"        MySQL_

::Delete data folder in MySQL directory, optionally copy old mysql tables
rd    /s /q "%serverdir%\MySQL\data"
md          "%serverdir%\MySQL\data"
xcopy /s /e "%datadir%\MySQL_\mysql" "%serverdir%\MySQL\data"

::Bootstrap the server (creates grant tables if they dont exist)
mysqld --bootstrap

::Run server, optionally upgrade tables and move upgrade log to data directory
start mysqld --skip-grant-tables
mysql_upgrade --force
move "%serverdir%\MySQL\bin\mysql_upgrade_info" "%serverdir%\MySQL\data"

::Import all databases, shutdown, delete logs, then move to old data dir
mysql      -uroot -p < %temp%\all.sql
mysqladmin -uroot -p shutdown
md  "%datadir%\MySQL"
del "%serverdir%\MySQL\data\ib_logfile?"
xcopy /s /e "%serverdir%\MySQL\data\*" "%datadir%\MySQL"
rd    /s /q "%serverdir%\MySQL\data"

::Start the server, if it works, then all should be well, so del
net start mysql
rd    /s /q "%datadir%\MySQL_"

5

Если у вас возникла эта странная дилемма в таблицах грантов MySQL для Windows, я рекомендую следующее:

Шаг 1. Получите дистрибутив ZIP FIle, в котором нет установщика.

Шаг 2. Распакуйте его содержимое в C:\MySQLZipStuff

Шаг 3. Ищите папку C:\MySQLZipStuff\data\mysql

Шаг 4. Скопируйте все файлы в C:\MySQLZipStuff\data\mysqlпапку mysql нужного вам каталога данных.

Шаг 5 net start mysql

Если у вас уже есть папка mysql, вы можете сделать это:

Шаг 1. Отредактируйте my.ini, добавив эту строку в раздел [mysqld]

[mysqld]
skip-grant-tables
skip-networking

Шаг 2. net stop mysql

Шаг 3. net start mysql

На этом этапе вы можете просто набрать «mysql» и войти. Однако вы не можете запускать команды GRANT с отключенными таблицами грантов.

Шаг 4. Вам нужно будет ввести одного суперпользователя вручную. Как это

а) INSERT INTO mysql.user SET user='root',host='localhost';

б) SELECT * FROM mysql.user WHERE user='root' AND host='localhost'\G

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

ОБНОВЛЕНИЕ mysql.user SET select_priv = 'Y', insert_priv = 'Y', ... WHERE user = 'root' AND host = 'localhost';

c) Установите пароль для root @ localhost следующим образом:

UPDATE mysql.user SET password=PASSWORD('whateverpasswordyouwant')
WHERE user='root' AND host='localhost';

Шаг 5. Удалить skip-grant-tablesи skip-networkingизmy.ini

Шаг 6 net stop mysql

Шаг 7 net start mysql

Теперь вы можете войти в mysql как пользователь root, используя пароль «whatpasswordyouwant».

Попробуйте!


Спасибо за советы; это много шагов, учитывая, что в Linux требуется всего один скрипт. :-(
Synetech

3

FYI,

это --initializeсейчас, а не устаревшие--bootstrap


NB. для полноты картины:

Чтобы запустить это с использованием непривилегированной учетной записи:

mysqld.exe --log_syslog=0 --console --standalone --initialize

Затем запустите сервер:

mysqld.exe   --log_syslog=0 --console --standalone

2

Для тех, кто использует XAMPP и сталкивается с этой проблемой, XAMPP поставляется с резервной копией этих таблиц mysql по умолчанию.

Скопируйте все в эту папку C:\xampp\mysql\backup\mysqlи вставьте ее C:\xampp\mysql\data\mysql, переписав все.

Будьте осторожны: данные могут быть потеряны - я не знаю, у меня была чистая установка.


Это удобно для XAMPP, но это довольно ограниченный сценарий использования, поскольку MySQL гораздо более универсален, чем отдельный веб-сервер.
Synetech

О, я знаю. Я просто хотел опубликовать это там для всех, кто попал на эту страницу после поиска в Google для этой ошибки, а также использует XAMPP (как я). Я не ожидаю, что это будет помечено как принятое, но будет оставлено в качестве ссылки для других.
Алек Ущелье

Хорошо. Я не осознавал, что необходимость ручного сброса XAMPP была обычной проблемой.
Synetech

Это не так, я понятия не имею, как это произошло, и я не хотел перезапускать установщик из-за страха перезаписать тщательно обработанные файлы конфигурации: P
Alec Gorge

О, я знаю! Поскольку в MySQL нет встроенного метода сжатия файла базы данных (например, vacuumкоманда SQLite3 и т. Д.), Я вынужден вручную выгружать его и время от времени создавать новый, поскольку у меня мало места; но я всегда беспокоюсь об этом, поэтому я отложил это как можно дольше.
Synetech
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.