【Nextcloud】バージョン31(Hub 10)にアップデートしたときの警告を修正する。
Nextcloudをバージョン30から31にアップデートした後、管理画面を覗くと複数の警告が表示された。
そのいくつかは、メッセージに書かれているとおりに occ を走らせれば解決するのだけれど、
…というメッセージと共に、大量のテーブル名リストが表示されるこれ、どうすれば良いのか。
調べたところ、「データベースのテーブルの行フォーマットを DYNAMIC に変更」すればよいとのこと。
コンソールで MariaDB / MySQL にログインして
> ALTER TABLE テーブル名 ROW_FORMAT=DYNAMIC;
を、指摘されたテーブルの数だけ実行すればよいのだけれど、面倒くさいので、PHP でスクリプトを書いてみる。多分こっちのほうが楽なんじゃないかな。
まず、警告画面からテーブル名リストをコピー。tablelist.txt みたいな適当な名前で保存します。うちの場合は以下のような感じ。
oc_activity_mq, oc_webauthn, oc_cards, oc_circles_member, oc_migrations, oc_user_transfer_owner, oc_systemtag_object_mapping, oc_recent_contact, oc_addressbookchanges, oc_accounts, oc_systemtag, oc_collres_resources, oc_circles_remote, oc_mimetypes, oc_calendar_invitations, oc_collres_collections, oc_text_documents, oc_circles_membership, oc_calendar_rooms_md, oc_calendar_resources, oc_directlink, oc_circles_share_lock, oc_group_user, oc_twofactor_backupcodes, oc_storages_credentials, oc_user_status, oc_circles_token, oc_flow_operations_scope, oc_calendar_rooms, oc_vcategory, oc_calendar_appt_configs, oc_users, oc_vcategory_to_object, oc_schedulingobjects, oc_mounts, oc_circles_mount, oc_authorized_groups, oc_addressbooks, oc_comments_read_markers, oc_known_users, oc_flow_operations, oc_groups, oc_login_flow_v2, oc_dav_cal_proxy, oc_authtoken, oc_file_locks, oc_federated_reshares, oc_calendarchanges, oc_share_external, oc_bruteforce_attempts, oc_preferences, oc_text_steps, oc_systemtag_group, oc_comments, oc_whats_new, oc_notifications, oc_files_trash, oc_notes_meta, oc_notifications_settings, oc_circles_event, oc_calendar_resources_md, oc_direct_edit, oc_privacy_admins, oc_calendar_appt_bookings, oc_calendar_reminders, oc_oauth2_access_tokens, oc_calendars, oc_collres_accesscache, oc_filecache, oc_calendarsubscriptions, oc_jobs, oc_notifications_pushhash, oc_dav_shares, oc_activity, oc_cards_properties, oc_text_sessions, oc_circles_circle, oc_carnet_metadata, oc_share, oc_oauth2_clients, oc_properties, oc_group_admin, oc_ratelimit_entries, oc_profile_config, oc_appconfig, oc_flow_checks, oc_twofactor_providers, oc_filecache_extended, oc_accounts_data, oc_trusted_servers, oc_storages, oc_calendarobjects_props, oc_calendarobjects, oc_circles_mountpoint
で、以下のような PHP(nc_fix.php としましょうか)を書いて、先程の tablelist.txt と同じ階層に保存。変数 $db、$user、$passwd は自身の環境のものに置き換えてください。
<?php
// Nextcloudで使用しているデータベース名、ユーザ名、パスワード。
// Nextcloudの config.php 内に記述されている。
$url = 'localhost';
$db = 'your_nc_db_name' ;
$user = 'your_nc_db_user_name';
$passwd = 'your_nc_db_password';
// DBに接続。
$dbLink = mysqli_connect( $url, $user, $passwd, $db ) or die( '接続失敗'.PHP_EOL );
// 先程のテキストファイルからテーブル名リストを取得し、配列に格納。
$tablelist = 'tablelist.txt';
$content = file_get_contents( $tablelist );
$tables = array_map('trim', explode(',', $content ));
// いっこずつ ROW_FORMAT を DYNAMIC に変更。
for( $i = 0 ; $i < sizeof( $tables ) ; $i++){
$sql = "ALTER TABLE {$tables[$i]} ROW_FORMAT=DYNAMIC";
mysqli_query( $dbLink , $sql ) or die('Fail:'.$i.PHP_EOL);
}
// Nextcloudで使用しているデータベース名、ユーザ名、パスワード。
// Nextcloudの config.php 内に記述されている。
$url = 'localhost';
$db = 'your_nc_db_name' ;
$user = 'your_nc_db_user_name';
$passwd = 'your_nc_db_password';
// DBに接続。
$dbLink = mysqli_connect( $url, $user, $passwd, $db ) or die( '接続失敗'.PHP_EOL );
// 先程のテキストファイルからテーブル名リストを取得し、配列に格納。
$tablelist = 'tablelist.txt';
$content = file_get_contents( $tablelist );
$tables = array_map('trim', explode(',', $content ));
// いっこずつ ROW_FORMAT を DYNAMIC に変更。
for( $i = 0 ; $i < sizeof( $tables ) ; $i++){
$sql = "ALTER TABLE {$tables[$i]} ROW_FORMAT=DYNAMIC";
mysqli_query( $dbLink , $sql ) or die('Fail:'.$i.PHP_EOL);
}
そして、nc_fix.php を実行。事前にデータベースのバックアップを取るなり、安全策は施してくださいね。
php nc_fix.php
これで警告は消える筈。
コメント