MySQLの GIS 機能で使用する INFORMATION_SCHEMA の ST_SPATIAL_REFERENCE_SYSTEMS テーブル(ビュー)の件数が、環境によって異なることがわかりました。
先日の、ClubMySQL #4 の発表中に「ものすごくたくさんの定義があるんですよ」と話したことから、何人かの方が早速手元の MySQL 8.0 で 同テーブルの COUNT(*) を取ってくれたのですが、人によって、
mysql> select count(*) FROM ST_SPATIAL_REFERENCE_SYSTEMS; +----------+ | count(*) | +----------+ | 5108 | +----------+
だったり、
mysql> select count(*) FROM ST_SPATIAL_REFERENCE_SYSTEMS; +----------+ | count(*) | +----------+ | 5152 | +----------+
だったり。
当初は、
MySQL 8.0.11: 5108件
MySQL 8.0.12: 5152件
なのだろう、と軽く考えていたのですが、家に帰ってから自分の環境で確認してみたところ、MySQL 8.0.12 なのに 5108件しかありませんでした。
そんなわけで、OSやインストール方法などにより異なるのではないかとの仮説を立てて、いくつか試したところ、まぁたぶんこうかな、という仮結論に達したので、本エントリに。
確認したのは、Windowsの MySQL Installer / Linux のバイナリインストール/同 yum インストール。
結論として、各バージョンを素の状態でインストールした場合は、
MySQL 8.0.11: 5108件
MySQL 8.0.12: 5152件
ということで、間違いなさそう。
MySQL 8.0.12 なのに 5152件しかない事象は、yum で 8.0.11 をインストールした環境で、 yum update により 8.012 に上げたケース。update後に手動で動かすべきスクリプトがあるのかな、とマニュアルを軽く探してみましたが、そういう記述も見つからず、もしかして bugs 報告相当の事象?とも思ったのですが、ちょっと自信がありません。
他のパッケージ管理システムの場合だとどうなんですかね。aptとかsuseとか。どなたか試してみていただけませんか。8.0.11を入れてから update する、という流れで、前後の ST_SPATIAL_REFERENCE_SYSTEMS の件数を確認すれば良いです。
ちなみに、手元のWindows、MySQL Installer で 8.0.11 を入れてあった環境を、同じく MySQL Installer で最新化して 8.0.12 にしたものだったと記憶しているので、こちらが 5152件だったというのは、WIndows版のアップデートでは ST_SRSテーブルの件数を最新化する仕組みがちゃんと入っているってことなんですよね。
ちなみに、増えた44個は、こんな感じ。GEOGCSが4つと、あとは投影座標系(PROJCS)ですね。
| VN-2000 / TM-3 zone 481 | 5896 | | VN-2000 / TM-3 zone 482 | 5897 | | VN-2000 / TM-3 zone 491 | 5898 | | VN-2000 / TM-3 Da Nang zone | 5899 | | S-JTSK [JTSK03] | 8351 |(GEOGCS) | S-JTSK [JTSK03] / Krovak | 8352 | | S-JTSK [JTSK03] / Krovak East North | 8353 | | NAD83 / NCRS Las Vegas (m) | 8379 | | NAD83 / NCRS Las Vegas (ftUS) | 8380 | | NAD83 / NCRS Las Vegas high (m) | 8381 | | NAD83 / NCRS Las Vegas high (ftUS) | 8382 | | NAD83(2011) / NCRS Las Vegas (m) | 8383 | | NAD83(2011) / NCRS Las Vegas (ftUS) | 8384 | | NAD83(2011) / NCRS Las Vegas high (m) | 8385 | | NAD83(2011) / NCRS Las Vegas high (ftUS) | 8387 | | GDA94 / WEIPA94 | 8391 | | ETRS89 / Gauss-Kruger CM 9E | 8395 | | Hong Kong Geodetic CS | 8427 |(GEOGCS) | Macao 1920 | 8428 |(GEOGCS) | Macao 2008 | 8431 |(GEOGCS) | Macao 1920 / Macao Grid | 8433 | | Tananarive / Laborde Grid | 8441 | | RGTAAF07 / UTM zone 53S | 8455 | | RGTAAF07 / UTM zone 54S | 8456 | | NAD83(2011) / KS RCS zone 1 | 8518 | | NAD83(2011) / KS RCS zone 2 | 8519 | | NAD83(2011) / KS RCS zone 3 | 8520 | | NAD83(2011) / KS RCS zone 4 | 8521 | | NAD83(2011) / KS RCS zone 5 | 8522 | | NAD83(2011) / KS RCS zone 6 | 8523 | | NAD83(2011) / KS RCS zone 7 | 8524 | | NAD83(2011) / KS RCS zone 8 | 8525 | | NAD83(2011) / KS RCS zone 9 | 8526 | | NAD83(2011) / KS RCS zone 10 | 8527 | | NAD83(2011) / KS RCS zone 11 | 8528 | | NAD83(2011) / KS RCS zone 12 | 8529 | | NAD83(2011) / KS RCS zone 13 | 8531 | | NAD83(2011) / KS RCS zone 14 | 8533 | | NAD83(2011) / KS RCS zone 15 | 8534 | | NAD83(2011) / KS RCS zone 16 | 8535 | | NAD83(2011) / KS RCS zone 17 | 8536 | | NAD83(2011) / KS RCS zone 18 | 8538 | | NAD83(2011) / KS RCS zone 19 | 8539 | | NAD83(2011) / KS RCS zone 20 | 8540 |
インストールメモ:
# yum install wget -y # wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm # yum localinstall mysql80-community-release-el7-1.noarch.rpm -y # yum install mysql-server -y # systemctl start mysqld # cat /var/log/mysqld.log | grep password $ mysql -uroot -p -- mysql> ALTER USER root@localhost IDENTIFIED BY 'MySQL8.0'; -- 旧バージョンを入れるときは # yum install mysql-community-server-8.0.11-1.el7 (以前に他のバージョンが入っていた場合はデータディレクトリを削除しておく)
追記:
@RKajiyama さんから、「mysql_upgrade を実行したらどうだ?」という情報をいただきました。
試せていませんがこちらのツール実行後はいかがでしょうか? https://t.co/J4xXNMMlAE
— 🐬🍣🍻 (@RKajiyama) September 2, 2018
試してみたところ、5152件と正しい件数になりました。
(yumで 8.0.11 をインストール → 件数確認 → yum update で 8.0.12 に上げる → 件数確認 → mysql_upgrade を実行 → 件数確認)
あとは、これを手動でやるのが「正しい手順」なのか、本来ならこれが yum update 時に自動で実行されているべきなのか、という点ですね。
以下参考までに実行記録:
MySQL 8.0.11のインストール@awsの t2.micro
sudo yum -y remove mariadb-libs yum install wget -y wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm yum localinstall mysql80-community-release-el7-1.noarch.rpm -y yum install mysql-community-server-8.0.11-1.el7 -y systemctl start mysqld cat /var/log/mysqld.log | grep password mysql -uroot -p -- mysql> ALTER USER root@localhost IDENTIFIED BY 'MySQL8.0'; mysql> use INFORMATION_SCHEMA mysql> SELECT COUNT(*) FROM ST_SPATIAL_REFERENCE_SYSTEMS; +----------+ | COUNT(*) | +----------+ | 5108 | +----------+
yumでの 8.0.12へのアップデート:
yum update mysql-server (略) +----------+ | COUNT(*) | +----------+ | 5108 | +----------+
mysql_upgrade 実行
# /bin/mysql_upgrade -uroot -p Enter password: Checking if update is needed. Checking server version. Running queries to upgrade MySQL server. Upgrading system table data. Checking system database. mysql.columns_priv OK mysql.component OK mysql.db OK mysql.default_roles OK mysql.engine_cost OK mysql.func OK mysql.general_log OK mysql.global_grants OK mysql.gtid_executed OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.innodb_index_stats OK mysql.innodb_table_stats OK mysql.password_history OK mysql.plugin OK mysql.procs_priv OK mysql.proxies_priv OK mysql.role_edges OK mysql.server_cost OK mysql.servers OK mysql.slave_master_info OK mysql.slave_relay_log_info OK mysql.slave_worker_info OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK The sys schema is already up to date (version 2.0.0). Checking databases. sys.sys_config OK Upgrade process completed successfully. Checking if update is needed. (略) +----------+ | count(*) | +----------+ | 5152 | +----------+
追追記: yum update で MySQL サーバが再起動された後、手動で mysql_upgrade を実行する必要があるようです。(8.0.12時点)
マニュアルの下記ページで3.Restarting MySQLのところに mysql_upgrade を実行するように書いてありますね。開発チームも将来的には mysql_upgrade 不要にしたいようですがまだできていないようです https://t.co/7OLfhi8rao
— 🐬🍣🍻 (@RKajiyama) September 2, 2018
https://dev.mysql.com/doc/refman/8.0/en/updating-yum-repo.html