質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

3回答

4253閲覧

bash sh を利用してselectした値をinsertする

enigumalu

総合スコア192

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2018/02/01 11:13

編集2022/01/12 10:55

データ漏れが発生した時用のリカバリーとして抽出データselectした値をinsertする機能を作成したのですが
sqlをDB(mysql)に対して直接実行したinsert intoだと場合によってロックされてしまうためだめだといわれました

insert into table_name ... select * from

sh(bash)での作成を考えているですが1回の処理で1度取得したデータをinsertできるような物を考えているのですがそういったことは可能でしょうか?
おそらく取得したパラメータを渡すような記述ができれば良いと考えています
正直まったくイメージできず困っています…
できればプログラムは介在しない方針が良いです
リカバリーはdump復元のような全体復旧ではなくあくまで漏れを潰す作業に使う運用です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/02 01:23

データベースはmysqlですか? 処理系も示すとより具体的な回答が集まるかもしれません。
guest

回答3

0

リカバリー用にselectした値をinsertするsqlを作成したのですが
insert intoだと場合によってロックされてしまうためだめだといわれました

何の話でしょうか?
この話とシェルスクリプトとはどういう風につながってくるのでしょうか?

また、シェルスクリプトでなければならない理由は何ですか?
PHP, Perl, Python等で書いてはダメなのでしょうか?

シェルスクリプトから別のスクリプトを呼ぶ方法もありますがそれでもダメでしょうか?

sh

1python main.py

投稿2018/02/01 11:19

aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ロックさせたくない、というのが正直よくわかりませんが(リカバリ中に他からデータ更新されてもよいのですかね?)、こういう方法もあるよということで。
DBMS 標準のバックアップ・リカバリツールを使わない条件ででっち上げた際にやった方法です。

1 インサートするべきデータを SELECT で抽出し、ファイルにテキスト(CSV/TSV)で吐き出す
2 トランザクション開始を宣言する
3 吐き出されたテキストを1行ずつ読みながら以下を行う

 3-1 読んだ1行からデータを分解して(READLINEで分解される)、INSERT 文を生成する
3-2 INSERT 文を発行する
3-3 適当な回数 INSERT したところで commit -> begin transaction を行う

4 読み終わったら commit して、すべてを確定させる。

十分にディスクが確保できるなら、3-2 などで SQL を発行するのではなく、SQL スクリプトをファイルにはいておいて、4 のあとで一気に流し込むというのもありです。

投稿2018/02/02 02:27

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問者さんの言うリカバリーは、具体的にどういうことをしたいのでしょうか。
データ構造の変更がない前提で、ある時点のデータに完全に巻き戻したい、という意味でしょうか。
(そういう意図でないならば、下記の回答文はずれてしまいますのでご容赦ください。)

勝手にmysqlだろう(わたしはposgresql-er)と察して、ざっくり書くと、
MySQL :: MySQL 5.6 リファレンスマニュアル :: 7.2 データベースバックアップ方法
MySQL :: MySQL 5.6 リファレンスマニュアル :: 7.4 バックアップへの mysqldump の使用
にあるように mysqldump で SQL フォーマットバックアップを作ったものを、
ファイルを改変してCREATE系をばっさり潰してテーブルにデータ投入する箇所だけ残したものを用意し、
必要なテーブル全てに対して truncate table~文を実行した後適用すれば
良さそうな気がします。(postgresqlでいうpg_dumpと同じだろうと察して。)

SQL フォーマットでなくとも、区切りテキストフォーマットバックアップという方法もあって、
MySQL :: MySQL 5.6 リファレンスマニュアル :: 7.4.4 区切りテキストフォーマットバックアップのリロード
mysqlimport で復元できそうですが、こちらは検討しましたか?

ところで、「ロックされてしまうためだめ」というのが少し気になります。
ある時点のデータに完全に巻き戻す作業をするのは一瞬で済む話ではないので、
作業中はサービス停止するのが当たり前だと思います。
ロックも何も関係ないと思うのですが。

投稿2018/02/02 01:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問