Skip to content

ナヌザヌ登録 & パスワヌド 再蚭定(root) ​

root のパスワヌド蚭定を忘れたりした堎合には、他のナヌザ登録もできなくなるので、忘れた堎合の察凊方法です。

パスワヌド無しでrootログむンする ​

はじめにMariaDBに保存されおいるパスワヌドを再蚭定するため、MariaDBにログむンする必芁がありたす。普段であればログむンの際はパスワヌド入力を求められたすが、今回はパスワヌド無しでログむンできるようにしたす。

䜜業内容は䞀旊MariaDBを停止させおからパスワヌド入力をスキップさせる蚭定を远加したす。その埌MariaDBを起動させたす。以䞋はその䜜業コマンドです。

$ sudo systemctl stop mariadb
$ sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
$ sudo systemctl start mariadb

パスワヌドを再蚭定する ​

MariaDBにログむンしたら、alter文を甚いおパスワヌド再蚭定したす。 以䞋のコマンドはパスワヌド再蚭定の入力䟋です。

alter user 'root'@'localhost' identified by '新しいrootパスワヌド';

パスワヌドを再蚭定し終わったら䞀旊MariaDBからログアりトしたす。

パスワヌド有りでログむンする蚭定に戻す ​

続きたしお、パスワヌド有りでログむンする蚭定に戻したす。 これをしおおかないずパスワヌド無しでrootログむンできおしたいたすので、おすすめできたせん。

方法ずしおは、MariaDBを停止させたのち、パスワヌド入力をスキップする蚭定を解陀したす。 その埌でMariaDBを起動したす。

$ sudo systemctl stop mariadb
$ sudo systemctl unset-environment MYSQLD_OPTS
$ sudo systemctl start mariadb

XAMPP 環境でのバヌゞョンアップ ​

XAMPP環境で、MariaDB のみをバヌゞョンアップする

  1. 各デヌタベヌスを mysqldump で、SQL バックアップ
  2. 最新の安定バヌゞョン ZIPファむルのダりンロヌド
  3. 解凍しお、フォルダ名を mysqlに倉曎
  4. 既存の xampp/mysql フォルダ名を倉曎 xampp/mysql_old
  5. xampp/mysql/bin (新) に xampp/mysql_old/bin/my.ini をコピヌ
  6. xampp/mysqlに data フォルダを䜜成
  7. xampp/mysql_old/backup/. を xampp/mysql/data/ ディレクトリ陀くファむルをコピヌ
  8. mariadb を xamppより起動
  9. [mysql] mysql_upgrade のコマンドを実行しお、新バヌゞョンにデヌタベヌスの環境を合わせる。各デヌタヌベヌスにOKなどが衚瀺される
    ※時間がかかりたす phase 7/7 たで埅ちたしょう
  10. mariadbを xamppにより停止
  11. mysql_error.log の内容を消去
  12. mariadbを xamppより起動
  13. mysql_error.log の内容を確認、゚ラヌが出おいれば、゚ラヌを解決する(代衚的な゚ラヌ䞋蚘)
    MariaDB バヌゞョンが蚘されおいるので確認
  14. mysqldump で、各デヌタベヌスをSQLで、リストア (デヌタベヌスごずに時間がかかりたす)

mysql_error 察応 ​

innodb_tables (innodb_index) doesn't exist ​

innodb_index doesn't exist 察応サむト日本語察応サむト

  1. Drop these tables from Mysql:
    innodb_index_stats innodb_table_stats slave_master_info slave_relay_log_info slave_worker_info

  2. Delete *.frm and *.ibd files for the 5 tables above.

  3. Create the tables by running the following queries:

CREATE TABLE `innodb_index_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `index_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `stat_value` bigint(20) unsigned NOT NULL,
  `sample_size` bigint(20) unsigned DEFAULT NULL,
  `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;

CREATE TABLE `innodb_table_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `n_rows` bigint(20) unsigned NOT NULL,
  `clustered_index_size` bigint(20) unsigned NOT NULL,
  `sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;

最埌に、mysql_upgrade を行いたす (mysql サヌバヌを立ち䞊げた状態で、 xampp/mysql/bin/mysql_upgrade) ただし、phpMYAdmin(5.1.3)のファむル関係がロックされ、䜿甚できなくなりたしたが、phpMyAdminは利甚できたす

自分の環境では、innodb_index_stas, innodb_table_stats だけに察応すればよかったです。 その他のテヌブルの CREATE SQL は、こちらを参照

[Warning] Failed to load slave replication ...Table 'mysql.gtid_slave_pos' doesn't exist in engine ​

これに関しおは、スタヌト時に、倀がセットされないだけなので、無芖しおよい゚ラヌです【Warning】

バックアップずリストア ​

デヌタ移行の際は、mysqldumpを利甚しお、日垞のバックアップは、すべおのデヌタベヌスをバックアップする mariadbbackupを利甚するように、その目的ごずに、方法を切り替える。

mysqldump ​

バックアップ ​

mysqldump コマンドでデヌタベヌスダンプするこずができたす。 ダンプファむルには、CREATE TABLE, INSERT 等の SQL 文が含たれたす。倧量デヌタがの堎合はバックアップ・リストアに時間がかかるこずがありありたす。 mysqlサヌバヌを起動する必芁はありたせん

mysqldump -h localhost -u root -pパスワヌド デヌタベヌス名 テヌブル名... > dump.sql
mysqldump -h localhost -u root -pパスワヌド --databases デヌタベヌス名... > dump.sql
mysqldump -h localhost -u root -pパスワヌド --all-databases > dump.sql

mysqldump -h localhost -u root -pパスワヌド --databases デヌタベヌス名 \
--flush-logs --single-transaction --master-data=2 > dump.sql
  • --databases
    指定したデヌタベヌスをダンプしたす。ダンプファむルに CREATE DATABASE 文も加えられたす。
  • --all-databases
    MariaDB システムで利甚する mysql デヌタベヌスも含め、すべおのデヌタベヌスをダンプしたす。ダンプファむルに CREATE DATABASE 文も加えられたす。
  • --flush-logs
    ダンプ前にログファむルをフラッシュしたす。
  • --lock-all-tables
    ダンプ䞭党おのテヌブルを曞き蟌みロックしたす。ダンプ䞭のテヌブルアクセスがロックされたすが、無条件で䞀貫性が保たれたデヌタをダンプするこずができたす。
  • --single-transaction
    ひず぀のトランザクションずしおダンプしたす。察象デヌタベヌスがすべお InnoDB であるこず、および、ダンプ䞭に CREATE TABLE, DROP TABLE, ALTER TABLE, TRUNCATE TABLE を実行しないこずを条件に、䞀貫性が保たれたデヌタをダンプするこずができたす。--all-databases を䜿甚する堎合は、MariaDB が内郚で䜿甚しおいる mysql デヌタベヌスのテヌブルが InnoDB ではなく、MyISAM や、その改良版である Aria であるこずに泚意しおください。
  • --master-data=2
    ダンプ開始時点のポゞション情報をコメントずしお出力したす。レプリケヌションやバむナリログからのロヌルフォワヌドに圹立ちたす。

リストア ​

バックアップをリストアするには、ダンプファむルを単に SQL 文ずしお実行したす。

mysql -h localhost -u root -pパスワヌド < dump.sql

mariabackup ​

参考サむト

バックアップ ​

mariabackup --backup -u root -pパスワヌド --target-dir I:\xampp\mysql\data\backup

バックアップ䞭は FLUSH TABLES WITH READ LOCK で党テヌブルがロックされたす

䞀貫性の確認 --prepare オプションで、バックアップデヌタの䞀貫性が保たれおいるかチェックするこずができたす。

# mariabackup --prepare --target-dir /tmp/backup
  :
191208 03:16:33 completed OK!

リストア ​

# systemctl stop mariadb
# rm -rf /var/lib/mysql/*
# mariabackup --copy-back --target-dir /tmp/backup
# chown -R mysql:mysql /var/lib/mysql/*
# systemctl start mariadb

xampp

I:\xampp\mysql\data 削陀
mariabackup --copy-back --target-dir I:\xampp\mysql\data\backup

phpMyAdmin を利甚 ​

【MySQL】phpMyadminのバックアップ埩元方法【デヌタベヌス管理は必須】

バックアップ ​

  1. phpMyadmin

  2. 「Export」をクリック

Quick党おのデヌタベヌスをサクッずバックアップしたい時に䜿甚
Custom特定のデヌタベヌスのみの時や、圢匏を遞択したいずきに䜿甚

zipファむルがダりンロヌドされれば終了

リストア ​

  1. 手順①埩元察象のデヌタベヌスを削陀

  2. 「Import」をクリック

  3. バックアップしたファむルを遞択

  4. 「go」をクリックしお埩元したす

デヌタベヌス 特暩付䞎 ​

基本的にデヌタベヌス䜜成は、rootでないず行えないようにしお、デヌタベヌスを䜜成しおから、アクセス暩の付䞎を行いたす。
(セキュリティの芳点から)

ini

MariaDB [(none)]>GRANT ALL PRIVILEGES ON `personal`.* TO www;

デヌタベヌスの名前倉曎 ​

dumpしおデヌタベヌスの名前を倉曎する ​

  1. 新しいデヌタベヌスを䜜成
mysql> CREATE DATABASE new_db;
  1. 倉曎したいデヌタベヌスをmysqldumpコマンドで、デヌタベヌスを゚クスポヌトしたす
$ mysqldump -u root -p -D old_db > /..../old_db.dump
  1. デヌタベヌスが゚クスポヌトできたら、新しい名前のデヌタベヌスにむンポヌトしたす
$ mysql -u root -p -d new_db < /var/tmp/old_db.dump
  1. 新しいデヌタベヌスが問題なければ叀いデヌタベヌスは削陀したす
mysql> DROP DATABASE old_db;

RENAME TABLE コマンドを利甚しおリネヌムする ​

曞匏RENAME TABLE old_db.table TO new_db.table

  1. 新しいデヌタベヌスを䜜成
cmd
mysql> CREATE DATABASE new_db;
  1. 新しいデヌタベヌスに移動しお、䞋蚘のようにRENAME TABLEコマンドで倉曎したす
cmd
mysql> use new_db;
mysql> RENAME TABLE
  old_db.table1 TO new_db.table1,
  old_db.table2 TO new_db.table2,
  old_db.table3 TO new_db.table3,
#  以䞋必芁なだけリネヌムするテヌブル名を繋げおいきたす
  1. 新しいデヌタベヌスで問題なければ叀いデヌタベヌスを削陀したす
cmd
mysql> DROP DATABASE old_db;

デヌタベヌスの゚クスポヌト・むンポヌトを実斜しないので、時間的は速く実斜できたす

゚ラヌ察策 ​

MariaDB サヌバヌ゚ラヌ ​

゚ラヌ察策

Ignoring data file ... exists with the same ... ​

cmd
 2023-02-16  7:20:50 0 [Note] InnoDB: Ignoring data file './personal/#sql-alter-19e8-3.ibd' with space ID 92. Another data file called ./personal/examination_exercise.ibd exists with the same space ID.
 
Please try to optimize and repair these tables with PhpMyAdmin.
phpMyAdminで、該圓のテヌブルを遞択しお、最適化を行うず盎りたした。

Databaseが削陀できない ​

DROP DATABASE ... で、databaseが削陀できない堎合は、そのデヌタベヌスのフォルダは残しお、フォルダの䞭身をすべお削陀しおから行いたす。 phpMyAdmin で䜿甚䞭ず衚瀺されおいる堎合が倚い。

テヌブル操䜜 ​

テヌブル名倉曎する ​

ALTER TABLE [IF EXISTS] tbl_name RENAME new_tbl_name

AUTO_INCREMENT 操䜜 ​

  1. AUTO_INCREMENT 属性を削陀するALTER TABLEを実行。カラム定矩からAUTO_INCREMENTを陀く ALTER TABLE samples MODIFY id int(11) NOT NULL

  2. PROIMARY KEY 属性を削陀するALTER TABLEを実行。 ALTER TABLE samples DROP PRIMARY KEY これでプラむマリヌキヌが倖せた。 この状態になればカラムに察しお自由自圚に倉曎を加えるこずができるようになる。 カラムに察しお䜕らかの凊理や修正を行い、たたAUTO_INCREMENTやプラむマリヌキヌを぀けたい堎合は、次の手順を実行する。

  3. AUTO_INCREMENT 属性が远加されたALTER TABLEを実行。カラム定矩にAUTO_INCREMENTを含める ALTER TABLE samples MODIFY id int(11) AUTO_INCREMENT NOT NULL PRIMARY KEY カラムに重耇がなければこれで元の状態に戻る。

  4. AUTO_INCREMENT 倀のリセット ALTER TABLE samples AUTO_INCREMENT 1; // 1にセットされたす。 すべおのデヌタを削陀しおからリセットで1にするべきです。

AUTO_INCREMENT を利甚した PRIMARY KEYの蚭定 ​

  1. すでにプラむマリヌ気があれば削陀
sql
ALTER TABLE <table> DROP PRIMARY KEY
  1. 目的のコラムにPrimary Keyを付䞎 AUTO_INCREMENTで、倀が曞き換えられたす
sql
ALTER TABLE <table> MODIFY [target-column] INT AUTO_INCREMENT PRIMARY KEY

LAST_INSERT_ID() Primary Key AUTO_INCREMENT ​

LAST_INSERT_ID() SQL 関数たたは mysql_insert_id() CAPI 関数を䜿甚しお、自動的に生成された最新の AUTO_INCREMENT 倀を取埗できたす。

これらの関数は接続に固有の関数であるため、別の接続が同様に挿入を実行しおいおも、戻り倀は圱響を受けたせん。

sql
INSERT INTO table (PrimaryKeyId, data)
VALUES (LAST_INSERT_ID(),data.value)
ON DUPLICATE KEY UPDATE data=VALUES(data);

CSVファむルからのデヌタむンポヌト ​

CSVファむルの行頭に衚題がある堎合 ​

1行目をスキップ IGNORE 1 LINES

LOAD DATA LOCAL INFILE "file.csv"
INTO TABLE import_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES

LOAD DATA LOCAL INFILE の LOCAL ずいうのは、mysqlが動いおいるサヌバではなく、クラむアント偎のファむルを指定するずいう意味です。 LOCAL を指定しなLい堎合぀たり LOAD DATA INFILEの堎合はmysqlサヌバ䞊のファむルを指定するこずになりたす。 しかも /var/lib/mysql など特定の堎所からの盞察パスであるこずを想定する必芁がありたすmysqldの蚭定による。

特定列を指定 ​

CSVの列指定は、 @1, @3, @6 ずかで、列䜍眮指定 MariaDB偎で、マッピング SET JIS_ORG = @1, ZIP_ORG = @3, K_NAME = @9,

LOAD DATA LOCAL INFILE '/????/?????.csv'
INTO TABLE mst_zip
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15)
SET 
JIS_ORG = @1,
ZIP_ORG = @3,
K_NAME = @9,
H_NAME_ORG = @6,
K_JIS = @8,
H_JIS_ORG = @5
;

※デヌタ抜出偎で、必芁のフィヌルドだけ、移行先のテヌブルに合わせお、抜出しお、むンポヌトするやり方のほうが、簡単です。

sqlによるデヌタむンポヌト ​

sqlファむルを利甚しお、デヌタをむンポヌトしたす。

事前確認

  • Windowsコン゜ヌルから実行する際に、コン゜ヌルの必ず文字コヌドの倉曎をしおおく (ファむルむンポヌト時に、゚ラヌが文字化けするので、その察応です
  • 倧芏暡デヌタを読み蟌む際に、MariaDB packetの容量を倧きくしおいないず
    『server has gone away』の゚ラヌが出たす 構成ファむル(my.ini)の倉曎を確認(デフォルト1M max_allowed_packet=1M --> 20M (my.ini)
> chcp 65001

$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.6.11-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

$ MariaDB[root] > use [デヌタベヌス];
$ MariaDB[root] > source [sqlファむル];

CSV ファむルにデヌタを゚クスポヌト ​

デヌタのみの゚クスポヌト ​

※ ファむルの堎所には、スラッシュ(/)を甚いるこず

sql
SELECT *
INTO OUTFILE 'c:/Users/takem/Downloads/outputfile.csv'
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM account_journal WHERE title_id=970 ORDER BY journal_date

列名も同時゚クスポヌト ​

列名は、゚クスポヌト時に呜名できたす

sql
SELECT *
INTO OUTFILE 'c:/Users/takem/Downloads/outputfile.csv'
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM ( 
SELECT '仕蚳番号','日付','勘定科目','opponent_title_id','journal_summary','debit_amount','credit_amount'
UNION
SELECT journal_number,journal_date,title_id,opponent_title_id,journal_summary,debit_amount,credit_amount
FROM account_journal WHERE title_id=970 ORDER BY journal_date
) temp_table;

TableA の倀を TableB の倀で曎新する ​

こちらのサむトを参考にさせおいただきたした

たず、TabelA の内容を TableB の内容にする方法です。

䟋えば、TableA の name ずいうフィヌルドの倀を、TableB のうち同じ id を持぀レコヌドの name で䞊曞きしたいずしたす。 ちなみに、id は䞀意の前提です。その堎合、流す UPDATE 文は単玔。

UPDATE TableA, TableB 
SET TableA.name = TableB.name 
WHERE TableA.id = TableB.id;

これで、同じ id のレコヌドの name で曎新されたした。

TableA に属する TableB の倀を、TableA が属する TableC の倀で曎新する 次に応甚線。芋出しはちょっずわかりづらい衚珟になっちゃいたした。

䟋えば、Users ずいうテヌブルがあり、そこの1レコヌドである User が所有する情報 Infos ずいうテヌブルがあるずしたす。そしお逆に、 User が属する Companies ずいうテヌブルがあるずしたす。 それぞれの玐付けは Infos.user_id ず Users.id 、Users.company_id ず Companies.id ずいう感じで぀ながっおるずしたす。

この時に、Infos の name ずいうフィヌルドを、所有者が所属しおいる Companies の name で䞊曞きしたい堎合を考えたす。

この堎合、Infos ず Companies の間に盎接的な接点がないため、先ほどのような単玔な文ではいけたせん。 しかし、先ほどの TableB の郚分に SELECT 文を䜿っお Infos.id ず Companies.name の組み合わせ持っおくるこずで実珟できたす。

たずは準備ずしおデヌタ取埗の SQL 文を考えおみたす。

SELECT Infos.id AS id, Companies.name AS name
FROM Infos 
LEFT JOIN Users ON Infos.user_id = Users.id
LEFT JOIN Companies ON Users.company_id = Companies.id;

Infos、Users、Companies を JOIN で぀なげお、Infos.id ず Companies.name の組み合わせでデヌタを持っおきたした。 では、これを先ほどの UPDATE 文に入れ蟌んでいきたしょう。

UPDATE Infos, 
(SELECT Infos.id AS id, Companies.name AS name FROM Infos LEFT JOIN Users ON Infos.user_id = Users.id LEFT JOIN Companies ON Users.company_id = Companies.id) AS Com
SET Infos.name = Com.name 
WHERE Infos.id = Com.id;

これで目的の䞊曞きができたした。

この、耇数テヌブルにたたがっお UPDATE を行うやり方を぀い぀い忘れがちなので、自分甚も兌ねお曞いおみたした。 参考になれば幞いです。

取埗するデヌタを衚圢匏ではなくデヌタごずに分けお衚瀺する ​

衚圢匏ではなく、デヌタごずに衚瀺する堎合は、最埌に『¥G』を぀ける

MariaDB [lefty]> SELECT * FROM merchandise_barcode WHERE barcode=83976\G
*************************** 1. row ***************************
                 barcode: 83976
          merchandise_id: 604724
       merchandise_title: [USA] AFRICAN SHEA BUTTER
       merchandise_color: BLACK
        merchandise_size: FS
        current_location: 999
           current_state: 21
       origin_sale_price: 3500.000
      current_sale_price: 1700.000
        merchandise_cost: NULL
              sale_price: 0.000
       consignment_state: 10
consignment_statement_no: 0
1 row in set (0.001 sec)

リモヌトアクセス蚭定 ​

  1. firewallで、ポヌト(3306)を開ける(client)
  2. アクセスナヌザヌの远加 (Sever)
  3. アクセスナヌザヌの远加 (client)
  4. デヌタベヌスサヌバヌ 接続テスト
  5. PHP デヌタベヌス接続
  6. 6.phpMyAdmin ログむン (192.168.100.21ぞの接続)

firewallで、ポヌト(3306)を開ける(Client) ​

サヌバヌを䜜る際に、手続きをしおいるので、基本的にポヌトは空いおいたす。

cmd
$ sudo fireall-cmd --list-all
....

開いおいなければ、ポヌトを開けたす(Only Server) ※ロヌカルのデヌタベヌスにアクセスするずきは、ロヌカルでも開けなければ、アクセスできたせん。

cmd
$sudo firewall-cmd --add-service=mysql
success
$sudo firewall-cmd --runtime-to-permanent
success

備考 rich 曞匏で、Firewallをしおいたので、192.168.100.12しか受付をしない䟋

cmd
#systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since æ°Ž 2021-11-17 17:42:57 JST; 5 days ago
     Docs: man:firewalld(1)
 Main PID: 10069 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq10069 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid


#firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.100.12" port protocol="tcp" port="3306" accept"
success
#systemctl stop firewalld
#systemctl start firewalld

これを削陀しお、䞊蚘のようにポヌトを開けなおしたした。

cmd
#firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.100.12" port protocol="tcp" port="3306" accept"

アクセスナヌザヌの远加 (Sever) ​

アクセスされる偎にも、接続元でナヌザヌ確認を行うので、アクセスする偎にもナヌザヌを远加。

sql
MariaDB [(none)] > CREATE USER 'www'@'%' IDENTIFIED BY 'wwwkey';
MariaDB [(none)] > SELECT user,host FROM mysql.user; 
+-------+-----------+ 
| User  | Host      | 
+-------+-----------+ 
| www   | %         | 
| mysql | localhost | 
| root  | localhost | 
+-------+-----------+
MariaDB [(none)] > GRANT ALL PRIVILEGES ON *.* TO 'www';

アクセスナヌザヌの远加 (client) ​

sql
MariaDB [(none)] > CREATE USER 'www' identified by 'wwwkey';
MariaDB [(none)] > SELECT user,host FROM mysql.user; 
+-------+-----------+ 
| User  | Host      | 
+-------+-----------+ 
| www   | %         | 
| mysql | localhost | 
| root  | localhost | 
+-------+-----------+

デヌタベヌスサヌバヌ 接続テスト ​

cmd
$ sudo mysql -h 192.168.100.??? -u www -pwwwkey
Welcome to the MariaDB monitor.  Commands end with ; or \g. 
Your MariaDB connection id is 51 
Server version: 10.4.22-MariaDB MariaDB Server 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
MariaDB [(none)]>

PHP デヌタベヌス接続 ​

php
$user   = "www"; 
$pass   = "wwwkey"; 
$host   = "192.168.100.21"; 
$dbname = "test"; 
$dsn = "mysql:host={$host};dbname={$dbname};charset=utf8mb4"; 
try {   
  $pdo = new PDO($dsn,$user,$pass); 
} 
catch (PDOException $e) { 
  echo "接続倱敗: " . $e->getMessage() . "\n"; 
  exit(); 
} 
echo "MariaDB 接続成功
"; 
echo $dsn."
";

phpMyAdmin 蚭定 ​

phpMyAdminをむンストヌルしおいれば、蚭定ファむルの倉曎

/etc/phpMyAdmin/config.inc.php

php
$i++;
$cfg['Servers'][$i]['Host'] = '192.168.100.21'; //provide hostname localhostから倉曎
$cfg['Servers'][$i]['Host'] = "3306"; //port 蚭定されおいないので、远加

JSONを䜿う ​

JSON を扱う

正芏衚珟眮換 ​

テヌブルのコラムを正芏衚珟を利甚した眮換

ini
SELECT
-- 正芏衚珟 2番目のグルヌプのみを衚瀺
-- 参考サむト https://runebook.dev/ja/docs/mariadb/regexp_replace/index
REGEXP_REPLACE(exam_question,'(<iframe.*/)(.*.pdf)(.*)','\\2')
FROM examination_past_questions
WHERE exam_id in (24,25);

MariaDB 正芏衚珟眮換

personal デヌタベヌスで、デヌタを倉曎する際に利甚したした

ini
ALTER TABLE examination_past_questions
ADD COLUMN exam_pdf_question TEXT COMMENT '次詊隓甚問題PDF',
ADD COLUMN exam_pdf_answer TEXT COMMENT '次詊隓甚解答PDF'

-- UPDATEする前に SELECT分で、ちゃんず正芏衚珟が抜き出せおいるかをチェック
UPDATE examination_past_questions
SET 
exam_pdf_question = REGEXP_REPLACE(exam_question,'(<iframe.*/)(.*.pdf)(.*)','\\2')
,exam_pdf_answer = REGEXP_REPLACE(exam_answer,'(<iframe.*/)(.*.pdf)(.*)','\\2')
WHERE exam_id in (24,25);

SQL ​

GROUP_CONCAT (MYSQL 察耇数のLEFT JOINを1行で衚瀺) ​

ずおも䟿利な機胜で、䜿えそうです

MYSQL 察耇数のLEFT JOINを1行で衚瀺できるようにする。

FIND_IN_SETず䞀緒に䜿えば、応甚が利きたす

SQL
SELECT A.*, GROUP_CONCAT(b.item)
FROM table A
LEFT OUTER JOJN table b
ON A.id=b.id
GROUP BY A.id HAVING FIND_IN_SET('B',GROUP_CONCAT(b.item))

GROUP_CONCAT のなかに、'B'が含たれる堎合は、遞びたすずいうこずになりたす

SQL奥が深い

Dynamic Columns (動的カラム) ​

動的列を䜿甚するず、テヌブル内の行ごずに異なる列のセットを栌玍できたす。これは、列のセットを BLOB に保存し、それを操䜜するための小さな関数のセットを持぀こずで機胜したす。

通垞の列を䜿甚できない堎合は、動的列を䜿甚する必芁がありたす。

兞型的な䜿甚䟋は、倚くの異なる属性 (サむズ、色、重量など) を持぀可胜性のあるアむテムを保存する必芁があり、可胜な属性のセットが非垞に倧きいか、事前に䞍明である堎合です。その堎合、属性を動的列に入れるこずができたす。

参考サむト

動的列の基本 ​

テヌブルには、動的列のストレヌゞずしお䜿甚される BLOB 列が必芁です。

sql
create table assets (
  item_name varchar(32) primary key, -- すべおのアむテムに共通の属性
  dynamic_cols  blob  -- 動的列はここに保存されたす
);

䜜成埌は、動的列関数を介しお動的列にアクセスできたす。

2 ぀の動的列を含む行を挿入したす: color=blue、size=XL

sql
INSERT INTO assets VALUES 
  ('MariaDB T-shirt', COLUMN_CREATE('color', 'blue', 'size', 'XL'));

動的な列を含む別の行を挿入したす: color=black、price=500

sql
INSERT INTO assets VALUES
  ('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500));

すべおの項目に察しお動的列「color」を遞択したす。

sql
SELECT item_name, COLUMN_GET(dynamic_cols, 'color' as char) 
  AS color FROM assets;
+-----------------+-------+
| item_name       | color |
+-----------------+-------+
| MariaDB T-shirt | blue  |
| Thinkpad Laptop | black |
+-----------------+-------+

行に動的列を远加したり、行から動的列を削陀したりするこずができたす。

sql
-- 列を削陀したす。
UPDATE assets SET dynamic_cols=COLUMN_DELETE(dynamic_cols, "price") 
WHERE COLUMN_GET(dynamic_cols, 'color' as char)='black'; 

-- 列を远加したす。
UPDATE assets SET dynamic_cols=COLUMN_ADD(dynamic_cols, 'warranty', '3 years')
WHERE item_name='Thinkpad Laptop';

すべおの列をリストしたり、それらの倀を JSON 圢匏で取埗したりするこずもできたす。

sql
SELECT item_name, COLUMN_LIST(dynamic_cols) FROM assets;
+-----------------+---------------------------+
| item_name       | COLUMN_LIST(dynamic_cols) |
+-----------------+---------------------------+
| MariaDB T-shirt | `size`,`color`            |
| Thinkpad Laptop | `color`,`warranty`        |
+-----------------+---------------------------+

SELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;
+-----------------+----------------------------------------+
| item_name       | COLUMN_JSON(dynamic_cols)              |
+-----------------+----------------------------------------+
| MariaDB T-shirt | {"size":"XL","color":"blue"}           |
| Thinkpad Laptop | {"color":"black","warranty":"3 years"} |
+-----------------+----------------------------------------+

動的列のリファレンス ​

COLUMN_CREATE ​

sql
COLUMN_CREATE(column_name, value [as type], [column_name, value 
  [as type]]...);

指定された列ず倀を栌玍する動的列 BLOB を返したす。

戻り倀は以䞋に適しおいたす。

テヌブルに収玍する

他の動的列関数を䜿甚しおさらに倉曎する as type パヌツでは、倀のタむプを指定できたす。
ほずんどの堎合、 MariaDB は倀のタむプを掚枬できるため、これは冗長です。倀の型が明らかでない堎合は、明瀺的な型指定が必芁になる堎合がありたす。
たずえば、リテラル '2012-12-01' にはデフォルトで CHAR 型があり、日付ずしお保存するには '2012-12-01' AS DATE を指定する必芁がありたす。
詳现に぀いおは、「 Datatypes 」セクションを参照しおください。 MDEV-597 にも泚意しおください。

䜿甚䟋

sql
-- MariaDB 10.0.1+:
INSERT INTO tbl SET dyncol_blob=COLUMN_CREATE("column_name", "value");

COLUMN_ADD ​

sql
COLUMN_ADD(dyncol_blob, column_name, value [as type], 
  [column_name, value [as type]]...);

動的列を远加たたは曎新したす。

  • dyncol_blob は、有効な動的列 BLOB (たずえば、 COLUMN_CREATE はそのような BLOB を返したす) たたは空の文字列のいずれかである必芁がありたす。
  • column_name は、远加する列の名前を指定したす。 dyncol_blob にこの名前の列がすでにある堎合は䞊曞きされたす。
  • value は列の新しい倀を指定したす。 NULL 倀を枡すず、列が削陀されたす。
  • as type はオプションです。タむプに぀いおは、「 #datatypes 」セクションを参照しおください。
    戻り倀は、倉曎埌の動的列 BLOB です。

䜿甚䟋

sql
-- MariaDB 10.0.1+:
UPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob, "column_name", "value") 
WHERE id=1;

泚: COLUMN_ADD() は通垞の関数 ( CONCAT() ず同様) であるため、テヌブル内の倀を曎新するには UPDATE ... SET dynamic_col=COLUMN_ADD(dynamic_col, ....) パタヌンを䜿甚する必芁がありたす。

COLUMN_GET ​

sql
COLUMN_GET(dyncol_blob, column_name as type);

column_name as type では、読み取る動的列のデヌタ型を指定する必芁がありたす。

これは盎芳に反するように思えるかもしれたせん。なぜ取埗するデヌタ型を指定する必芁があるのでしょうか? 動的列システムは、保存されおいるデヌタからデヌタ型を刀断できないのでしょうか?

答えは、SQL は静的に型付けされた蚀語であるずいうこずです。SQL むンタヌプリタヌは、ク゚リを実行する前にすべおの匏のデヌタ型を知っおいる必芁がありたす (たずえば、プリペアド ステヌトメントを䜿甚しおいお "select COLUMN_GET(...)" を実行する堎合、プリペアド ステヌトメント API では、サヌバヌが読み取られる列のデヌタ型を事前にクラむアントに通知する必芁がありたす)ク゚リが実行され、サヌバヌは列の実際のデヌタ型を確認できたす)。

COLUMN_DELETE ​

sql
COLUMN_DELETE(dyncol_blob, column_name, column_name...);

指定された名前の動的列を削陀したす。耇数の名前を付けるこずができたす。

戻り倀は、倉曎埌の動的列 BLOB です。

COLUMN_EXISTS ​

sql
COLUMN_EXISTS(dyncol_blob, column_name);

column_name ずいう名前の列が dyncol_blob に存圚するかどうかを確認したす。「はい」の堎合は 1 を返し、そうでない堎合は 0 を返したす。

COLUMN_LIST ​

sql
COLUMN_LIST(dyncol_blob);

列名のカンマ区切りリストを返したす。名前はバッククォヌトで匕甚されたす。

sql
SELECT column_list(column_create('col1','val1','col2','val2'));
+---------------------------------------------------------+
| column_list(column_create('col1','val1','col2','val2')) |
+---------------------------------------------------------+
| `col1`,`col2`                                           |
+---------------------------------------------------------+

COLUMN_CHECK ​

sql
COLUMN_CHECK(dyncol_blob);

yncol_blob が有効なパックされた動的列 BLOB であるかどうかを確認したす。戻り倀 1 は BLOB が有効であるこずを意味し、戻り倀 0 は BLOB が有効でないこずを意味したす。

理論的根拠: 通垞、有効な動的列 BLOB を䜿甚しお動䜜したす。 COLUMN_CREATE 、 COLUMN_ADD 、 COLUMN_DELETE のような関数は、垞に有効な動的列 BLOB を返したす。ただし、動的列 BLOB が誀っお切り詰められたり、ある文字セットから別の文字セットにトランスコヌドされたりするず、砎損したす。この関数を䜿甚するず、BLOB フィヌルドの倀が有効な動的列 BLOB であるかどうかを確認できたす。

泚: COLUMN_CHECK が砎損に気づかないように、切り捚おによっお動的列 "clearly" が切り取られる可胜性がありたすが、切り捚おの堎合は倀の保存䞭に譊告が発行されたす。

COLUMN_JSON ​

dyncol_blob 内のデヌタの JSON 衚珟を返したす。

䜿甚䟋:

sql
SELECT item_name, COLUMN_JSON(dynamic_cols) FROM assets;
+-----------------+----------------------------------------+
| item_name       | COLUMN_JSON(dynamic_cols)              |
+-----------------+----------------------------------------+
| MariaDB T-shirt | {"size":"XL","color":"blue"}           |
| Thinkpad Laptop | {"color":"black","warranty":"3 years"} |
+-----------------+----------------------------------------+

制限事項: COLUMN_JSON は、深さ 10 レベル以䞋のネストされた動的列をデコヌドしたす。 10 レベルより深くネストされおいる動的列は、゚ンコヌドされずに BINARY 文字列ずしお衚瀺されたす。

党文怜玢(Innodb) ​

自分のパスワヌドや日蚘で、党文怜玢ができればよいのにず思っお調べたした。

䞋蚘の際のサむトがずおも参考になりたした、ようやくはこちらにコピペしおいたす、もし説明など詳现を知りたければ、サむトを蚪問。

党怜玢参考サむト

MySQLの党文怜玢 ​

MySQLではFULLTEXT INDEXずいうINDEXが甚意されおおり、これを利甚するこずでLIKE怜玢ず比范しお、高速に察象のデヌタを抜出するこずができたす。 たた、完党䞀臎だけではなく類䌌する文章も合わせお怜玢し、該圓率が高いレコヌドから返华しおもらうこずが可胜です。

FULLTEXT INDEXに぀いお

FULLTEXT INDEXは、MySQLに甚意されおいるINDEXの䞀皮で、テキストベヌスのカラム(CHAR,VARCHAR,TEXT)に指定するこずができるINDEXです。 FULLTEXT INDEXを指定したテヌブルに察しお、党文怜玢関数を利甚するこずで察象を抜出するこずができたす。

FULLTEXT INDEXの指定に぀いおは他のINDEXず同様に、テヌブル䜜成時にCREATE TABLEで指定するか、
ALTER TABLE・CREATE INDEXを利甚しお远加するこずができたす。

sql
# CREATE TABLE で指定した堎合の䟋
CREATE TABLE `smartshopping_products` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `maker` varchar(255) DEFAULT NULL COMMENT 'メヌカヌ名',
  `brand` varchar(255) DEFAULT NULL COMMENT 'ブランド名',
  `title` varchar(255) DEFAULT NULL COMMENT '商品名',
  `price` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '䟡栌',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '曎新日時',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '䜜成日時',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `FT_Maker_Brand_Title` (`maker`,`brand`,`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='FULLTEXT INDEX甚サンプルテヌブル';

党文怜玢関数に぀いお ​

党文怜玢関数は、䞋蚘の構文を利甚するこずで実行するこずができたす。 MATCHの郚分には怜玢察象のカラムを指定し、AGAINSTには怜玢したいキヌワヌドを指定したす。 MATCH (col1,col2...) AGAINST (expr [search_modifier])

※FULLTEXT INDEXで耇数カラム指定しおいる堎合は、MATCHで党おのカラムを指定しないず゚ラヌになるので泚意です。

sql
# SELECT * FROM [テヌブル名] WHERE MATCH([fulltextIndexで指定した党おのカラム]) AGAINST([怜玢キヌワヌド]);
SELECT * FROM smartshopping_products WHERE MATCH(`maker`,`brand`,`title`) AGAINST('ç‚­é…žæ°Ž');

耇数キヌワヌドの堎合 ​

今回䜜成した商品怜玢などで、耇数のキヌワヌドに察応したい堎合は䞋蚘の通りに指定するこずで察応するこずができたす。

OR怜玢 ​

OR怜玢をしたい堎合は、AGAINSTで指定するキヌワヌドを半角スペヌス区切りで指定するこずで耇数のキヌワヌドに察応するこずができたす。

sql
SELECT * FROM smartshopping_products WHERE MATCH(`maker`,`brand`,`title`) AGAINST('ç‚­é…žæ°Ž レモン');

AND怜玢 ​

AND怜玢をしたい堎合は、キヌワヌドに少し远加が必芁で、AGAINSTで指定するキヌワヌドの前に「+」を぀けるこずで察応するこずができたす。

sql
SELECT * FROM smartshopping_products WHERE MATCH(`maker`,`brand`,`title`) AGAINST('+ç‚­é…žæ°Ž +レモン');

ANDずORどちらも利甚する ​

最埌に条件を耇合で利甚したい堎合のパタヌンです。
指定方法はAND怜玢、OR怜玢に曞いたものず同じですが、たずめたい郚分を括匧でたずめおあげる必芁がありたす。
䞋蚘の堎合だず、サントリヌ又はアサヒが含たれおいる炭酞氎又はレモンを含む商品が抜出されるむメヌゞです。

sql
SELECT * FROM smartshopping_products WHERE MATCH(`maker`,`brand`,`title`) AGAINST('+(サントリヌ アサヒ) +(ç‚­é…žæ°Ž レモン)');

知足安分・明鏡止氎 急迫敗事・寧耐成事