Node.jsでMySQL(MariaDB)を使いたいので、メモる。
MySQLは、WordPressをInstした時にphpMyAdminを入れて操作するようになった
https://shirakawa.weblike.jp/blog-page/2022/03/13…
が、phpMyAdminが便利だったので、SQLiteの様にコマンドで直接操作する事
https://shirakawa.weblike.jp/blog-page/2024/03/06…
があまり無かった。
PHPの代わりにNode.jsを使いたいので、簡単なコマンド操作をやってみる。
$ sudo sh /etc/rc.d/rc.mysqld start
240818 xx:yy:zz mysqld_safe Logging to ‘/var/lib/mysql/darkstar.example.net.err’.
240818 xx:yy:zz mysqld_safe Starting mariadbd daemon with databases from /var/lib/mysql
$ sudo mysql -u root
(メモ省略)
MariaDB [(none)]> show databases;
\+——————–+
\| Database |
\+——————–+
\| information_schema |
\| mysql |
\| performance_schema |
\| phpmyadmin |
\| practice310 |
\| shop |
\| test |
\| wordpress |
\| wordpress2 |
\+——————–+
\10 rows in set (0.045 sec)
MariaDB [(none)]> use practice310;
\Reading table information for completion of table and column names
\You can turn off this feature to get a quicker startup with -A
\Database changed
MariaDB [practice310]> show tables;
\+———————–+
\| Tables_in_practice310 |
\+———————–+
\| mst_people |
\+———————–+
\1 row in set (0.000 sec)
MariaDB [practice310]> select * from mst_people;
\+——+———–+———–+——————-+
\| code | firstName | lastName | email |
\+——+———–+———–+——————-+
\| 10 | Alice | Henderson | alice@example.com |
\+——+———–+———–+——————-+
\1 row in set (0.011 sec)
MariaDB [practice310]> create database practice920;
\Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> use practice920;
\Database changed
MariaDB [practice920]> CREATE TABLE IF NOT EXISTS mst_message ( code INT PRIMARY KEY AUTO_INCREMENT, name TEXT NOT NULL, email TEXT NOT NULL, message TEXT NOT NULL );
\Query OK, 0 rows affected (0.029 sec)
MariaDB [practice920]> SHOW TABLES;
\+———————–+
\| Tables_in_practice920 |
\+———————–+
\| mst_message |
\+———————–+
\1 row in set (0.001 sec)
MariaDB [practice920]> INSERT INTO mst_message (name, email, message) VALUES (‘test’, ‘test@test.jp’, ‘this is test’);
\Query OK, 1 row affected (0.003 sec)
MariaDB [practice920]> SELECT * FROM mst_message;
\+——+——+————–+————–+
\| code | name | email | message |
\+——+——+————–+————–+
\| 1 | test | test@test.jp | this is test |
\+——+——+————–+————–+
\1 row in set (0.000 sec)
MariaDB [practice920]> SHOW VARIABLES LIKE ‘port’;
\+—————+——-+
\| Variable_name | Value |
\+—————+——-+
\| port | 0 |
\+—————+——-+
\1 row in set (0.001 sec)
MariaDB [practice920]> exit
\Bye
MySQL(MariaDB)が、127.0.0.1:3306 でなかった件:
$ sudo mysql -u root –host=localhost –port=3306
MariaDB [(none)]> status
\————–
\mysql Ver 15.1 Distrib 10.5.13-MariaDB, for Linux (x86_64) using readline 5.1
\
\Connection id: 4
\Current database:
\Current user: root@localhost
\SSL: Not in use
\Current pager: stdout
\Using outfile: ”
\Using delimiter: ;
\Server: MariaDB
\Server version: 10.5.13-MariaDB Source distribution
\Protocol version: 10
\Connection: Localhost via UNIX socket
\Server characterset: latin1
\Db characterset: latin1
\Client characterset: utf8
\Conn. characterset: utf8
\UNIX socket: /var/run/mysql/mysql.sock
\Uptime: 21 min 38 sec
\
\Threads: 1 Questions: 9 Slow queries: 0 Opens: 17 Open tables: 10 Queries per second avg: 0.006
\————–
(これまで、PHPやGoって UNIX socket で動いていたのか?)
MariaDB [(none)]> exit
$ sudo mysql -u root –host=localhost –port=3306 –protocol=tcp
ERROR 2002 (HY000): Can’t connect to MySQL server on ‘localhost’ (115)
$ sudo mysql -u root -h 127.0.0.1
ERROR 2002 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (115)
ChatGPTに聞いたりググりまくったが、
https://syslog.life/2020/03/16/mysql-command-list/
https://ja.stackoverflow.com/questions/43007/mysql
https://qiita.com/kazegusuri/items/85478e6863453041dd68
https://qiita.com/KOJI-YAMAMOTO/items/084cb136f4c28ac53aab
https://takuya-1st.hatenablog.jp/entry/2019/03/11/115831
https://qiita.com/yoshiokaCB/items/df4ae185be7cbc4f03ac
https://nanaco-programming.hatenablog.com/entry/2019/06/11/121751
$ ps ax | grep mysql
\ 1238 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe –datadir=/var/lib/mysql –pid-file=/var/run/mysql/mysql.pid –skip-networking
\ 1343 pts/0 Sl 0:00 /usr/libexec/mariadbd –basedir=/usr –datadir=/var/lib/mysql –plugin-dir=/usr/lib64/mysql/plugin –user=mysql –skip-networking –log-error=/var/lib/mysql/darkstar.example.net.err –pid-file=/var/run/mysql/mysql.pid –port=3306
(何だよ、–skip-networking って。これをコメントアウトしたらつながった)
$ sudo nvi /etc/rc.d/rc.mysqld
\# To allow outside connections to the database comment out the next line.
\# If you don’t need incoming network connections, then leave the line
\# uncommented to improve system security.
\SKIP=”–skip-networking”
(PHPやGoの方がNode.jsよりセキュリティ上の優位性がある?。それともNode.jsにもSocketで
つながる方法があるのか?)
\
Error: Incorrect string value: ‘\xE3\x83\x86\xE3\x82\xB9…’ for column `practice920`.`mst_message`.`message` at row 1 at PromiseConnection.execute (/myproj/oldcygwin/practice900/practice920/corpo-5pages/node_modules/mysql2/promise.js:112:22)
このエラーメッセージは、MySQLデータベースに挿入しようとしている文字列が、データベースのテーブルで使用されている文字エンコーディングと一致しないことを示しています。
MariaDB [practice920]> SHOW TABLE STATUS WHERE Name = ‘mst_message’;
(latin1_swedish_ci だった、多分def。というかどう考えてもphpMyAdminで設定した方が楽だな~)
MySQL/MariaDBでは、LOCK TABLES および UNLOCK TABLES を実行するには、そのユーザーに適切な権限が必要です。特に、LOCK TABLES は、LOCK TABLES 権限とデータベース内のすべてのテーブルに対する SELECT 権限を必要とします。権限を確認。
MariaDB [web-seisaku]> SHOW GRANTS FOR ‘root’@’localhost’;
\+—————————————————————————————————————————————————————————+
\| Grants for root@localhost \|
\+—————————————————————————————————————————————————————————+
\| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING ‘*1FA85AA204CC12B39B20E8F1E839D11B3F9E6AA4′ OR unix_socket WITH GRANT OPTION |
\| GRANT PROXY ON ”@’%’ TO ‘root’@’localhost’ WITH GRANT OPTION |
\+—————————————————————————————————————————————————————————+
MySQLのInnoDBテーブルを使用している場合、LOCK TABLESはトランザクション内では使用できません。InnoDBは行レベルのロックを自動的に処理するため、通常は明示的にテーブル全体をロックする必要はありません。
テーブルがInnoDBエンジンを使用しているか確認。
MariaDB [web-seisaku]> SHOW TABLE STATUS LIKE ‘mst_message’;
\+————-+——–+———+————+——+—————-+————-+—————–+————–+———–+—————-+———————+———————+————+——————–+———-+—————-+———+——————+———–+
\| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | Max_index_length | Temporary |
\+————-+——–+———+————+——+—————-+————-+—————–+————–+———–+—————-+———————+———————+————+——————–+———-+—————-+———+——————+———–+
\| mst_message | InnoDB | 10 | Dynamic | 24 | 682 | 16384 | 0 | 0 | 0 | 37 | 2023-09-15 xx:yy:zz | 2024-09-14 xx:yy:zz | NULL | utf8mb4_general_ci | NULL | | | 0 | N |
\+————-+——–+———+————+——+—————-+————-+—————–+————–+———–+—————-+———————+———————+————+——————–+———-+—————-+———+——————+———–+
InnoDBテーブルである場合は、LOCK TABLES を省略しても問題ないはずです。必要であれば、LOCK TABLESの代わりにトランザクション(BEGIN、COMMIT、ROLLBACK)を使用します。
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/Symfony
MySQLにて、あるDB(eccube_001)のテーブル(dtb_base_info)を別のDB(laravel_001)へコピーして追加したい。SQLコマンドは?
MySQLで、データベース eccube_001 内のテーブル dtb_base_info を別のデータベース laravel_001 にコピーするためには、以下のSQLコマンドを実行します。
MariaDB [eccube_001]> CREATE TABLE `laravel_001`.dtb_base_info AS SELECT * FROM `eccube_001`.dtb_base_info;
または、すでに laravel_001 データベース内に dtb_base_info テーブルが存在していて、そのテーブルにデータのみを追加したい場合は、次のように INSERT INTO を使います:
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_base_info SELECT * FROM `eccube_001`.dtb_base_info;
注意点
・アクセス権限: コマンドを実行する際には、コピー元・コピー先のデータベース両方に対する適切な権限が必要です。
・カラム構成: コピー先テーブルがすでに存在する場合、コピー元テーブルと同じカラム構成であることを確認してください。
他のDBも同様にコピーした。
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_page SELECT * FROM `eccube_001`.dtb_page;
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_layout SELECT * FROM `eccube_001`.dtb_layout;
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_block SELECT * FROM `eccube_001`.dtb_block;
MariaDBで他のデータベースにテーブルをコピーするときにINSERT INTOを使用すると、データの行とカラム定義はコピーされますが、インデックスや外部キー、その他の制約はコピーされません。これらの構造情報を含めてテーブルを複製するためには、以下の方法を試すと良いでしょう。
(phpMyAdminでlaravel_001のdtb_layoutテーブルを削除し、以下を実行した)
MariaDB [eccube_001]> CREATE TABLE `laravel_001`.dtb_layout LIKE `eccube_001`.dtb_layout;
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_layout SELECT * FROM `eccube_001`.dtb_layout;
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’
コピー先の dtb_layout テーブルに同じ PRIMARY KEY 値(この場合は ‘1’)が既に存在するために発生しています。このような重複エラーを回避する方法として以下のアプローチが考えられます。
1.既存データの削除
コピー先のテーブル(laravel-ec001.dtb_layout)に既存のデータが不要であれば、以下のSQLコマンドでテーブルのデータを削除した後にコピーを行います。
MariaDB [eccube_001]> DELETE FROM `laravel_001`.dtb_layout;
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_layout SELECT * FROM `eccube_001`.dtb_layout;
3. 重複を避けるための ON DUPLICATE KEY UPDATE
コピー先に重複がある場合、重複行を更新する方法もあります。この方法では、重複するプライマリキー(id)が存在する場合はデータが更新され、そうでない場合は新たに挿入されます:
MariaDB [eccube_001]> DELETE FROM `laravel_001`.dtb_layout;
MariaDB [eccube_001]> INSERT INTO `laravel_001`.dtb_layout SELECT * FROM `eccube_001`.dtb_layout ON DUPLICATE KEY UPDATE id = VALUES(id);
(結局、これを実行した)
\
これ以降、新規でコピーした場合は、ERROR 1062 (23000) は発生していない。(2024.12)
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/Symfony
できている分をBackUpとして残し、コピーしてLaravel用を作る。あと、LunarとそのDBは削除。(2024.12,2025.01)
MySQLにて、あるDB(eccube_001)を別名(eccube_la001)でコピーして新たなDBとしたい。SQLコマンドは?
最も一般的で簡単な方法は、mysqldump コマンドを使用してデータベースをエクスポートし、新しいデータベースにインポートする方法です。これはコマンドラインから実行する手順ですが、SQLコマンドだけではデータベース全体をコピーする直接的な方法がないため、推奨されます。
$ mysqldump -u root -p eccube_001 > eccube_001.sql
MariaDB [(none)]> CREATE DATABASE eccube_la001;
$ mysql -u root -p eccube_la001 < eccube_001.sql
$
MariaDB [eccube_la001]>
Lunarのテーブル削除はコマンドで実行する場合、テーブル名をいちいち指定する
DROP TABLE lunar_1, lunar_2, lunar_3;
か、DROP_TABLE文を作る
1. 削除対象のテーブル名を確認
SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = ‘eccube_la001’ AND table_name LIKE ‘lunar_%’;
2. 動的SQLを生成して削除
SELECT CONCAT(‘DROP TABLE ‘, GROUP_CONCAT(table_name), ‘;’) AS drop_query
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = ‘eccube_la001’ AND table_name LIKE ‘lunar_%’;
が、イマイチ分かりにくいのでphpMyAdminで削除した。ChatGPTは’*’を推奨しなかったが、過去の
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/HTML/CSS/PHP%a4%ce%ce%fd%bd%ac%20%bc%c2%c1%a9%20%bb%a8%c2%bf%a4%ca%b5%ad%cf%bf
を見るとやっぱり使ってる、SELECT lp.*。今度やってみる。
参考URL:
mysql show variables port、でググった:
https://syslog.life/2020/03/16/mysql-command-list/
https://style.potepan.com/articles/19452.html#Port
MariaDB を 127.0.0.1 でアクセスする、でググった:
https://ja.stackoverflow.com/questions/43007/mysql-mariadb-%E3%81%A7-localhost-127-0-0-1-1-%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF
https://qiita.com/ekzemplaro/items/990441529ec8fa258935
mysql コマンド db作成、でググった:
mysql コマンド、でググった:
(必要になったらググる)
参考AI:
https://chat.openai.com/auth/login
テーブルの内容を表示するコマンドは?
DBのテーブルを表示するコマンドは?
DBを表示するコマンドは?
新しいDBを作成するコマンドは?
SQLiteでのコマンド: create table if not exists mst_message ( code integer primary key autoincrement, name text not null, email text not null, message text not null); をMySQLではどう書く?
SQLiteでのコマンド: insert into mst_message ( name, email, message) values (‘test’, ‘test@test.jp’, ‘this is test’); をMySQLではどう書く?