mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
MDEV-28471 mysql_install_db.exe does not work with --innodb-page-size=64K
The error message "InnoDB: innodb_page_size=65536 requires innodb_buffer_pool_size >= 20MiB current 10MiB" is the relevant one. The root cause: mysql_install_db bootstraps with --innodb-buffer-pool-size=10M. Small bufferpool is here by design - bootstrap should succeed, even if there is not much RAM available, bootstrap does not need that much memory. For pagesize 64K specifically, Innodb thinks it needs a larger bufferpool, and thus it lets the bootstrap process die (although the expected behavior in this case would be to adjust value, give warning and continue) The workaround: - pass --innodb-buffer-pool-size=20M, which is suitable for all page sizes. - check the same limit in MSI custom action. Also, the patch adds mtr test for 64K page size.
This commit is contained in:
parent
c1063a1bed
commit
f027c1217b
3 changed files with 37 additions and 21 deletions
|
@ -42,6 +42,13 @@ remove_file $log;
|
||||||
|
|
||||||
rmdir $ddir;
|
rmdir $ddir;
|
||||||
|
|
||||||
|
# MDEV-28471 - mysql_install_db.exe fails with --innodb-page-size=64K
|
||||||
|
--disable_result_log
|
||||||
|
exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R --innodb-page-size=64K --verbose
|
||||||
|
--enable_result_log
|
||||||
|
rmdir $ddir;
|
||||||
|
|
||||||
|
# Tests with config file
|
||||||
let $restart_parameters=;
|
let $restart_parameters=;
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
|
|
|
@ -333,7 +333,7 @@ static char *init_bootstrap_command_line(char *cmdline, size_t size)
|
||||||
" %s"
|
" %s"
|
||||||
" --bootstrap"
|
" --bootstrap"
|
||||||
" --datadir=."
|
" --datadir=."
|
||||||
" --loose-innodb-buffer-pool-size=10M"
|
" --loose-innodb-buffer-pool-size=20M"
|
||||||
"\""
|
"\""
|
||||||
, mysqld_path, opt_verbose_bootstrap ? "--console" : "");
|
, mysqld_path, opt_verbose_bootstrap ? "--console" : "");
|
||||||
return cmdline;
|
return cmdline;
|
||||||
|
|
|
@ -663,6 +663,12 @@ unsigned long long GetMaxBufferSize(unsigned long long totalPhys)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Magic undocumented number for bufferpool minimum,
|
||||||
|
allows innodb to start also for all page sizes.
|
||||||
|
*/
|
||||||
|
static constexpr unsigned long long minBufferpoolMB= 20;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Checks SERVICENAME, PORT and BUFFERSIZE parameters
|
Checks SERVICENAME, PORT and BUFFERSIZE parameters
|
||||||
*/
|
*/
|
||||||
|
@ -791,34 +797,37 @@ extern "C" UINT __stdcall CheckDatabaseProperties (MSIHANDLE hInstall)
|
||||||
unsigned long long availableMemory=
|
unsigned long long availableMemory=
|
||||||
GetMaxBufferSize(memstatus.ullTotalPhys)/ONE_MB;
|
GetMaxBufferSize(memstatus.ullTotalPhys)/ONE_MB;
|
||||||
swprintf_s(invalidValueMsg,
|
swprintf_s(invalidValueMsg,
|
||||||
L"Invalid buffer pool size. Please use a number between 1 and %llu",
|
L"Invalid buffer pool size. Please use a number between %llu and %llu",
|
||||||
availableMemory);
|
minBufferpoolMB, availableMemory);
|
||||||
if(BufferPoolSizeLen == 0 || BufferPoolSizeLen > 15)
|
if (BufferPoolSizeLen == 0 || BufferPoolSizeLen > 15 || !BufferPoolSize[0])
|
||||||
{
|
{
|
||||||
ErrorMsg= invalidValueMsg;
|
ErrorMsg= invalidValueMsg;
|
||||||
goto LExit;
|
goto LExit;
|
||||||
}
|
}
|
||||||
for (DWORD i=0; i < BufferPoolSizeLen && BufferPoolSize[BufferPoolSizeLen];
|
|
||||||
i++)
|
|
||||||
{
|
|
||||||
if(BufferPoolSize[i]< '0' || BufferPoolSize[i] > '9')
|
|
||||||
{
|
|
||||||
ErrorMsg= invalidValueMsg;
|
|
||||||
goto LExit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BufferPoolSize[BufferPoolSizeLen]=0;
|
BufferPoolSize[BufferPoolSizeLen]=0;
|
||||||
MsiSetPropertyW(hInstall, L"BUFFERPOOLSIZE", BufferPoolSize);
|
MsiSetPropertyW(hInstall, L"BUFFERPOOLSIZE", BufferPoolSize);
|
||||||
long long sz = _wtoi64(BufferPoolSize);
|
wchar_t *end;
|
||||||
if(sz <= 0 || sz > (long long)availableMemory)
|
unsigned long long sz = wcstoull(BufferPoolSize, &end, 10);
|
||||||
|
if (sz > availableMemory || sz < minBufferpoolMB || *end)
|
||||||
{
|
{
|
||||||
if(sz > 0)
|
if (*end == 0)
|
||||||
{
|
{
|
||||||
swprintf_s(invalidValueMsg,
|
if(sz > availableMemory)
|
||||||
L"Value for buffer pool size is too large."
|
{
|
||||||
L"Only approximately %llu MB is available for allocation."
|
swprintf_s(invalidValueMsg,
|
||||||
L"Please use a number between 1 and %llu.",
|
L"Value for buffer pool size is too large."
|
||||||
availableMemory, availableMemory);
|
L"Only approximately %llu MB is available for allocation."
|
||||||
|
L"Please use a number between %llu and %llu.",
|
||||||
|
availableMemory, minBufferpoolMB, availableMemory);
|
||||||
|
}
|
||||||
|
else if(sz < minBufferpoolMB)
|
||||||
|
{
|
||||||
|
swprintf_s(invalidValueMsg,
|
||||||
|
L"Value for buffer pool size is too small."
|
||||||
|
L"Please use a number between %llu and %llu.",
|
||||||
|
minBufferpoolMB, availableMemory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ErrorMsg= invalidValueMsg;
|
ErrorMsg= invalidValueMsg;
|
||||||
goto LExit;
|
goto LExit;
|
||||||
|
|
Loading…
Add table
Reference in a new issue