Merge pull request #19328 from nextcloud/backport/19303/stable16

[stable16] Fix occ maintenance:install database connect failure
This commit is contained in:
blizzz 2020-04-14 13:08:04 +02:00 committed by GitHub
commit 8e067112e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 6 deletions

View file

@ -132,6 +132,10 @@ class Install extends Command {
} else {
$dbHost = $input->getOption('database-host');
}
if ($dbPort) {
// Append the port to the host so it is the same as in the config (there is no dbport config)
$dbHost .= ':' . $dbPort;
}
$dbTablePrefix = 'oc_';
if ($input->hasParameterOption('--database-table-prefix')) {
$dbTablePrefix = (string) $input->getOption('database-table-prefix');
@ -181,7 +185,6 @@ class Install extends Command {
'dbpass' => $dbPass,
'dbname' => $dbName,
'dbhost' => $dbHost,
'dbport' => $dbPort,
'dbtableprefix' => $dbTablePrefix,
'adminlogin' => $adminLogin,
'adminpass' => $adminPassword,

View file

@ -343,11 +343,9 @@ class Setup {
$this->config->setValues($newConfigValues);
$dbSetup->initialize($options);
try {
$dbSetup->initialize($options);
$dbSetup->setupDatabase($username);
// apply necessary migrations
$dbSetup->runMigrations();
} catch (\OC\DatabaseSetupException $e) {
$error[] = [
'error' => $e->getMessage(),
@ -361,6 +359,16 @@ class Setup {
];
return $error;
}
try {
// apply necessary migrations
$dbSetup->runMigrations();
} catch (Exception $e) {
$error[] = [
'error' => 'Error while trying to initialise the database: ' . $e->getMessage(),
'hint' => '',
];
return $error;
}
//create the user and group
$user = null;

View file

@ -29,6 +29,7 @@
*/
namespace OC\Setup;
use OC\DatabaseSetupException;
use OC\DB\MySqlTools;
use OCP\IDBConnection;
use OCP\ILogger;
@ -40,6 +41,20 @@ class MySQL extends AbstractDatabase {
//check if the database user has admin right
$connection = $this->connect(['dbname' => null]);
$result = $connection->query('SHOW VARIABLES LIKE "version" ;');
$row = $result->fetch();
$version = strtolower($row['Value']);
if (strpos($version, 'mariadb') !== false) {
if (version_compare($version, '10.4', '>=')) {
throw new DatabaseSetupException(sprintf('Unsupported MariaDB version %s, Nextcloud 16 requires a version lower than 10.4', $row['Value']));
}
} {
if (version_compare($version, '8', '>=')) {
throw new DatabaseSetupException(sprintf('Unsupported MySQL version %s, Nextcloud 16 requires a version lower than 8.0', $row['Value']));
}
}
// detect mb4
$tools = new MySqlTools();
if ($tools->supports4ByteCharset($connection)) {
@ -55,6 +70,16 @@ class MySQL extends AbstractDatabase {
//fill the database if needed
$query='select count(*) from information_schema.tables where table_schema=? AND table_name = ?';
$connection->executeQuery($query, [$this->dbName, $this->tablePrefix.'users']);
$connection->close();
$connection = $this->connect();
try {
$connection->connect();
} catch (\Exception $e) {
$this->logger->logException($e);
throw new \OC\DatabaseSetupException($this->trans->t('MySQL username and/or password not valid'),
$this->trans->t('You need to enter details of an existing account.'));
}
}
/**
@ -100,9 +125,10 @@ class MySQL extends AbstractDatabase {
$password = $this->dbPassword;
// we need to create 2 accounts, one for global use and one for local user. if we don't specify the local one,
// the anonymous user would take precedence when there is one.
$query = "CREATE USER '$name'@'localhost' IDENTIFIED WITH mysql_native_password BY '$password'";
$query = "CREATE USER '$name'@'localhost' IDENTIFIED BY '$password'";
$connection->executeUpdate($query);
$query = "CREATE USER '$name'@'%' IDENTIFIED WITH mysql_native_password BY '$password'";
$query = "CREATE USER '$name'@'%' IDENTIFIED BY '$password'";
$connection->executeUpdate($query);
}
catch (\Exception $ex){