В общем случае, вот что вам следует сделать для апгрейда к версии 4.0 с более старой:
Выполнить скрипт
mysql_fix_privilege_tables
чтобы добавить новые привилегии и возможности в таблицы привилегий MySQL.Подредактировать скрипты запуска MySQL или конфигурационные файлы, чтобы не использовать устаревшие опции, описанные ниже.
Преобразовать ваши старые ISAM-файлы в формат MyISAM следующей командой:
mysql_convert_table_format база данных
. Обратите внимание, это нужно делать только если все таблицы в базе данных являются таблицами типа ISAM или MyISAM. Если это не тот случай, вам тогда следует выполнитьALTER TABLE имя_таблицы TYPE=MyISAM
для всех ISAM-таблиц.Удостоверьтесь, что у вас не используется никакие клиенты MySQL, что используют динамические библиотеки (например, Perl Msql-Mysql-modules). Если у вас есть такие, их следует перекомпилировать, т.к. структуры в
libmysqlclient.so
изменились.
MySQL 4.0 будет работать, даже если вы не выполните эти шагы, но у вас не будет возможности использовать новые привилегии, которые предоставляет MySQL 4.0, и у вас могут быть проблемы при дальнейшем апгрейде к 4.1 или более новым серверам. Формат ISAM в MySQL 4.0 все еще работает, но он уже морально устарел и будет исключен из версии MySQL 5.0.
Старые клиенты должны работать с версией 4.0 без каких-либо проблем.
И даже если вы выполните эти шаги, вы сможете произвести даунгрейд к MySQL 3.23.52 или более новой, если у вас возникнут проблемы с MySQL 4.0. В этом случае вам потребуется выполнить mysqldump на всех таблицах, использующих полнотекстовые индексы и восстановить dump на версии 3.23. Причина заключается в том, что MySQL 4.0 использует новый формат полнотекстовых индексов.
Вот подробный список того, на что следует обратить внимание при апгрейде к 4.0:
-
В MySQL 4.0 появилось большое количество новых привилегий в таблице
mysql.user
. See Раздел 4.3.1, «Синтаксис командGRANT
иREVOKE
».Чтобы заставить эти новые привилегии работать, следует запустить скрипт
mysql_fix_privilege_tables
. До выполнения данного скрипта у всех пользователей будут привилегииSHOW DATABASES
,CREATE TEMPORARY TABLES
иLOCK TABLES
. Значения для привилегийSUPER
иEXECUTE
берутся изPROCESS
, дляREPLICATION SLAVE
иREPLICATION CLIENT
- изFILE
.Чтобы скрипты, создающие новых пользователей, могли использовать новые привилегии, их нужно модифицировать. Если в этих скриптах не используется команда
GRANT
, то сейчас самое время изменить их.В версии 4.0.2 опция
--safe-show-database
устарела и не рекомендуется (и она больше ничего не делает). See Раздел 4.2.3, «Опции запускаmysqld
, относящиеся к безопасности».Если в версии 4.0.2 для новых пользователей возникают ошибки отказа в доступе, то следует проверить, не требуются ли вам некоторые новые привилегии, которые не были нужны раньше. В частности, для новых репликаций понадобится
REPLICATION SLAVE
(вместоFILE
). -
Параметры запуска
myisam_max_extra_sort_file_size
иmyisam_max_extra_sort_file_size
теперь указываются в байтах (до 4.0.3 указывались в мегабайтах).Внешняя блокировка файлов MyISAM/ISAM теперь выключена по умолчанию. Можно включить ее обратно опцией
--external-locking
. Для большинства пользователей этого никогда не потребуется делать. -
Следующие переменные/опции были переименованы:
Из В. myisam_bulk_insert_tree_size
bulk_insert_buffer_size
query_cache_startup_type
query_cache_type
record_buffer
read_buffer_size
record_rnd_buffer
read_rnd_buffer_size
sort_buffer
sort_buffer_size
warnings
log-warnings
err-log
--log-error
(дляmysqld_safe
)Опции запуска
record_buffer
,sort_buffer
иwarnings
все еще работают в MySQL 4.0, но считаются уже морально устаревшими. -
Следующие SQL-переменные переименованы.
Из В. SQL_BIG_TABLES
BIG_TABLES
SQL_LOW_PRIORITY_UPDATES
LOW_PRIORITY_UPDATES
SQL_MAX_JOIN_SIZE
MAX_JOIN_SIZE
QUERY_CACHE_TYPE
QUERY_CACHE_TYPE
Старые имена в MySQL 4.0 работают, но уже не рекомендованы к использованию.
Вы должны использовать
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=#
вместоSET SQL_SLAVE_SKIP_COUNTER=#
.Переименовали опцию запуска
mysqld
--skip-locking
в--skip-external-locking
и--enable-locking
в--external-locking
.SHOW MASTER STATUS
теперь возвращает пустой результат если двоичный журнал обновлений не включен.SHOW SLAVE STATUS
возвращает пустой результат если подчиненный сервер не инициализирован.mysqld теперь обладает опцией
--temp-pool
включенной по умолчанию, т.к. это дает лучшую производительность на некоторых ОС (в основном, на Linux).Столбцы
DOUBLE
иFLOAT
теперь учитывают флагUNSIGNED
при хранении (раньшеUNSIGNED
игнорировался для этих столбцов).ORDER BY столбец DESC
теперь сортирует величиныNULL
в первую очередь; в 3.23 это было не всегда так. Внимание: в MySQL 4.0.11 восстановлено оригинальное поведение.SHOW INDEX
имеет на 2 столбца больше (Null
иIndex_type
), чем в версии 3.23.CHECK
,SIGNED
,LOCALTIME
иLOCALTIMESTAMP
теперь являются зарезервированными словами.Результат работы всех поразрядных операторов
|
,&
,<<
,>>
и~
сейчас является беззнаковым. Это может вызвать проблемы при использовании их в контексте, где желателен результат со знаком. See Раздел 6.3.5, «Функции приведения типов».Замечание: результат операции вычитания между целыми величинами, одна из которых имеет тип
UNSIGNED
, будет беззнаковым! Другими словами, перед модернизацией до MySQL 4.0 вы должны проверить свои приложения для случаев, где производится вычитание величины из беззнакового объекта и предполагается ответ с отрицательным знаком, или вычитание беззнаковой величины из целочисленного столбца. Данный режим можно заблокировать, используя опцию--sql-mode=NO_UNSIGNED_SUBTRACTION
при запускеmysqld
. See Раздел 6.3.5, «Функции приведения типов».Для того чтобы использовать
MATCH ... AGAINST (... IN BOOLEAN MODE)
на таблицах, следует перестроить их заново при помощиREPAIR TABLE table_name USE_FRM
.LOCATE()
иINSTR()
чувствительны к регистру, если один из аргументов является двоичной строкой. В противном случае они не зависят от регистра.STRCMP()
при выполнении сравнений сейчас использует текущий набор символов; это означает, что операция сравнения по умолчанию начиная с данной версии является независимой от регистра.HEX(string)
сейчас возвращает символы строки, преобразованные в шестнадцатеричные. Если необходимо преобразовать число в шестнадцатеричное представление, убедитесь, чтоHEX()
вызывается с числовым аргументом.В версии 3.23 в команде
INSERT INTO ... SELECT
параметрIGNORE
всегда был разрешен. В версии 4.0.1 MySQL остановится (и, возможно, произойдет откат) в случае ошибки, еслиIGNORE
не задан явно.Скрипт
safe_mysqld
переименован вmysqld_safe
. Некоторое время мы будем включатьsafe_mysqld
в дистрибутив как символическую ссылку наmysqld_safe
.Старые функции C API
mysql_drop_db
,mysql_create_db
иmysql_connect
больше не будут поддерживаться, если вы не скомпилируете MySQL сCFLAGS=-DUSE_OLD_FUNCTIONS
). Вместо перекомпиляции лучше пересобрать клиента для использования нового 4.0 API.В структуре
MYSQL_FIELD
величиныlength
иmax_length
изменены сunsigned int
наunsigned long
. Это не должно вызывать проблем, за исключением того, что при использовании величин с такими типами в качестве аргументов в функциях классаprintf()
могут генерироваться предупреждающие сообщения.Если необходимо удалить из таблицы все строки, но вам не нужно знать, сколько строк было удалено, следует использовать
TRUNCATE TABLE
при (посколькуTRUNCATE TABLE
значительно быстрее, чемDELETE FROM table_name
).При попытке выполнить
TRUNCATE TABLE
илиDROP DATABASE
при наличии активной командыLOCK TABLES
или транзакции вы получите ошибку.Для хранения величин в столбцах
BIGINT
необходимо использовать целые числа (вместо строк, как было в MySQL 3.23). Возможность использования строк для данного случая пока еще работает, но применение целых чисел более эффективно.Изменен формат
SHOW OPEN TABLE
.Многопоточные клиенты должны использовать
mysql_thread_init()
иmysql_thread_end()
. See Раздел 8.4.8, «Как создать клиентскую программу с потоками».При желании перекомпилировать модуль Perl
DBD::mysql
необходимо получить версиюMsql-Mysql-modules
1.2218 или более новую, поскольку в более старых модуляхDBD
использовался не поддерживаемый вызов функцииdrop_db()
.В версии 4.0
RAND(seed)
возвращает иные последовательности случайных чисел, чем в 3.23; это сделано для того, чтобы лучше различатьRAND(seed)
иRAND(seed+1)
.Тип результата, возвращаемый
IFNULL(A,B)
теперь по умолчанию устанавливается более "общий" по отношению к типамA
иB
. Порядок выбора -STRING
,REAL
илиINTEGER
.