cronで定期的にmysqldumpし、定期的にバックアップサーバに送る方法(バックアップ鯖が取りに来る)

背景 Mysqlをデータベースにしてサービスを運営している。 しかし現在、Mysqlのバックアップは取っておらず、元データが消えたら全データが消える状況である。 そこで、元サーバで毎日指定された時刻にmysql_dumpをし、バックアップサーバが元サーバからデータを持ってく量なcronジョブ を作りたいと思っている。 注意点としては、本番サーバはグローバルに、バックアップ鯖はローカルネットワークにいるので、グローバルからローカルには送れないってこと。(vpnとか貼ったらいけるけどめんどい)ので、バックアップサーバもcronでscpを動かして定期的に鶏肉という感じ。 AC 毎日元サーバから吐かれたmysqldumpファイルがバックアップサーバに置かれた状態になっている 関連技術 cron 参考 設定ファイル /var/spool/cron/crontabs/<user name> が設定ファイルです。 rootユーザ用のcronを設定する方法は、 sudo vim /var/spool/cron/crontabs/root って感じで開けます。 このファイルに実行したいジョブと実行日時(実行間隔も指定可能)を指定します。 0 * * * * /home/backup.sh 五つの*が何を表すかですが、 「分 時 日 月 曜日」 結構忘れがちなのが、シェルスクリプトのパーミッションでexecuteが入ってなくてエラーになることが多いので気をつけて。(上の/home/backup.sh) ログについて(ubuntu) デフォルトではログが出力されないようになっている。 こちらを参考にログを出力するように設定を変える vi /etc/rsyslog.d/50-default.conf # コメントアウト cron.* /var/log/cron.log # リスタート service rsyslog restart mysqldump 参考文献 こちら 上のによると、特定のユーザが持っているデータベースをダンプする方法は以下のようになるかな。 mysqldump -u hoge -p -B some_database > database.sql ちなみに、パスワードの入力まで自動でやるとするとこんな感じです。 0 21 * * * mysqldump -u -hogehoge --password="hogehoge" --no-tablespaces DB_NAME > /hoge/database.sql 毎日21:01にSCPでとってくるcron jobをしくむ。さらにdbへの流し込みもやってくれると最高だよね〜。 まず、scpでpasswordを打たなくていいように鍵をリモートサーバに登録 sudo vim /etc/ssh/sshd_config # 以下をコメントアウト PubkeyAuthentication yes ssh-keygenで秘密鍵と公開鍵を生成 パスフレーズを入れないのがポイント ...

September 28, 2024 · 1 min · 176 words · Me

分散システム学習再始動

出会いに感謝 類は友を呼ぶとは言ったものだが、やはり部署が同じ人というのは興味も似てくる。 とはいっても、まさかTiDBやcockroachDBのコントリビュータとお友達になれるとは思わないわけで。 尊敬しかない。自分はあきらめてしまった道を一人で突き進んでいったのだろう。 自分の弱さがふがいない。せっかく先陣を切ってくれた先人がいるのだから、これは後に続こうと思える。 ロールモデルがあると自分も頑張ろうと思えるわけで。こんなところで師匠に出会えるとは、、、最高すぎる。 ということで、もう一度、分散システムに挑んでみようと思う。 とりあえず今日話したことをメモ 今のデータベース、MySQLとかはレプリケーションという技術を使って、一つのデータベースのテーブルを複数のノードにレプリケーションしている。レプリケーションされたデータが存在するノードが読み取り専用になる。マスターと呼ばれるノードは一台で、書き込みはここにだけ行われる。 しかし、これでは書き込み速度がスケールしないという問題点が生じる。そこで、noSQLというやつが出てきたんだよね。しかし、noSQLは整合性を保つのが難しいという課題があったんだよね。 そこで出てきたのがnewSQLというやつだね。tidb等。これを使うとwriteを容易にスケールすることができる。という話だ。 ほほう。なるほど。 ちなみに、俺が大好きなandrew pavloがこんな論文を出している andrew pavlo これによるとnewSQLの必要十分条件は、 NewSQL system’s implementation has to use (1) a lock-free concurrency control scheme and (2) a shared-nothing distributed architecture まじか、これだけでいいのか。 この記事がすごくいい感じに論文をまとめてくれている。 データベースの種類 RDBMS: mysql, postgresqlなど noSQL: cassandra, dynamodb newSQL: TiDB, cochroachDB 自分が過去に書いたデータベース関係の記事を見返したい TiDBについて調べていた時期もありましたねー 流れ まずはraftについてちゃんと理解するのが大事だと思う。実は完全に理解したとはいいがたい。 分散データベースを作るならまずは分散してないデータベースを作れないといけない。ということで、CMUのbustubの講義は受けなおした方がいい。 分散システムを理化するためにデータ志向アプリケーションを読もう。頼んだ。 いきなりだが、TiDBを読み込もう。cochroachDBでもいいと思う。この時にdesign Docsを読むのがいいらしい。 その他の疑問 シャーティングという技術がある。 これは、データを複数のノードに分散して格納することで、検索速度を上げる方法。 RAID0(ストライピング)とはまた別なのね? シャーディング(Sharding) 目的:データを分割して、複数のデータベースサーバに分散させ、スケーラビリティを向上させることです。 特徴: データベース全体を論理的に分割し、それぞれの部分を「シャード」と呼ばれる個別のデータベースに保存します。 各シャードは独立したデータベースとして動作し、特定のデータサブセットを保持します。 シャードは水平分割とも呼ばれ、特定のキー(例:ユーザーID、地域、日時など)に基づいてデータを分割します。 データの分割によって、単一のデータベースサーバにかかる負荷を分散させ、スケーラビリティとパフォーマンスを向上させます。 例: ユーザーIDに基づいて、ユーザーデータをシャードA、シャードB、シャードCに分割する。 ストライピング(Striping) 目的:データを分散してストレージパフォーマンスを向上させることです。主にデータの読み書き速度を向上させるために使用されます。 特徴: 単一のファイルやデータセットを複数のストレージデバイスに均等に分割して保存します。 各ストライプは連続したデータブロックを含み、ストライプ単位で並行して読み書きが行われます。 RAID(Redundant Array of Independent Disks)のコンセプトの一つであり、特にRAID 0が代表的です。 ストライピングは、ディスクI/O性能を向上させるために使用されますが、冗長性やフェールオーバーの機能はありません(特にRAID 0では)。 例: 1GBのファイルを4つのディスクに分割し、各ディスクに256MBずつ書き込む。 まとめ シャーディングは、データベース全体を複数のシャードに分割し、各シャードを異なるサーバに分散させることで、スケーラビリティとパフォーマンスを向上させる手法です。 ストライピングは、データを複数のストレージデバイスに均等に分割して並行して読み書きすることで、ストレージのパフォーマンスを向上させる手法です。 ストライピングとシャーティングの両方を使うことはできますか?

July 16, 2024 · 1 min · 87 words · Me

About_JOIN_of_SQL

ことはじめ チーム開発演習で、SpringBootのMapperファイルを書いていたんですよね。Mapper.xmlってやつ。 んで、ここがおかしくてバグが生じていたんだけど、JOINについてちゃんと理解していなかったからだった。 JOINには色々あってさ、inner joinとかouter joinとか。 たくさんのテーブルを繋げまっくる時って、どのJOINにするかが大事って話だ。 まずはすごくわかりやすい図があるのでそれで学んでくれ Left JoinとInner Joinをミスっていた。 SELECT I.ITEM_ID, I.ITEM_NAME, I.DESCRIPTION, I.PRICE, I.IMAGE AS ITEM_IMAGE, I.UPDATED_AT AS ITEM_UPDATE_AT, I.CREATED_AT AS ITEM_CREATED_AT, I.DELETE_FLAG AS ITEM_DELETE_FLAG, COUNT(I.ITEM_ID = L.ITEM_ID) AS LIKE_COUNT, U.USER_ID, U.EMAIL, U.PASSWORD, U.PROFILE, U.IMAGE AS USER_IMAGE, U.DELETE_FLAG AS USER_DELETE_FLAG, U.UPDATED_AT AS USER_UPDATED_AT, U.CREATED_AT AS USER_CREATED_AT, U.USER_NAME, C.CATEGORY_ID, C.CATEGORY_NAME, C.UPDATED_AT AS CATEGORY_UPDATED_AT, C.CREATED_AT AS CATEGORY_CREATED_AT FROM ITEMS I LEFT OUTER JOIN USERS U ON I.USER_ID = U.USER_ID LEFT OUTER JOIN CATEGORIES C ON I.CATEGORY_ID = C.CATEGORY_ID LEFT OUTER JOIN LIKES L ON I.ITEM_ID = L.ITEM_ID WHERE I.ITEM_ID = #{itemId} GROUP BY I.ITEM_ID これ長いけど非常にいいSQLだよね。学ぶことがいっぱいある。それは置いておいて、ここのLEFT OUTER JOINのところ、普通のJOINにすると共通部分しか出て来なくなってしまうんだよね。 で、どこに問題が潜んでいるかというと、 ...

June 20, 2024 · 1 min · 162 words · Me

Posix_and_filesystem

ことはじめ いやー、研究でね、1プロセスからマルチスレッドで、ストレージから多次元配列データのサブセットを並列読み出しをする必要があってね。 HDF5っていうライブラリは、全配列データを一つのファイルで管理する一方で、 TileDBは配列データを複数のファイルに分けて管理しているんですね。 で、ですよ。前にも説明した通り、HDF5を使ってPararell readをしようとすると、 なんと性能がスケールしないんですよね。で、HDF5の公式サイトを見ると、HDF5はマルチスレッドをサポートしていないって書いてあったんですよ。 ただね、「マルチスレッドをサポートしていない」っていうのは、OSとのやり取り、具体的には、ファイルシステムとか、スレッドとか、その辺でインタラクションが生じて、 「マルチスレッドをサポートできない」んだと思うんですよね。 というのもね、chatGPTに聞いた話によると、 POSIX I/O operations, by default, do not provide built-in support for parallel reading of a single file from multiple threads. When multiple threads attempt to read from a single file concurrently using POSIX I/O functions, there is a potential for race conditions and data corruption because POSIX I/O operations do not provide automatic synchronization between threads for file access. ってことなんですよね。でね、システムがどのファイルシステムを使っていたかっていうとね、ext4なんですよね。でね、ext4はPOSIX互換なんですよね。 つまり、どうやら、HDF5がマルチスレッドをサポートしていないのではなく、 ext4が単一ファイルの並列読み書きをサポートしていない可能性が高くなってきた。 まだ確証は得られていないのですが。ということで、今からファクトチェックをしていきたいと思っています。 ...

January 5, 2024 · 2 min · 249 words · Me

Postgres_newbies

ことはじめ 事情があってね、Mysqlではなく、Postgresを使わないといけないのですよ。 でね、PostgreSQL徹底入門手本を買ったので、それのまとめとか、読んでて気づいたこととか思ったこととか、そういうのまとめておきましょう。 全体を読んでの感想 やはり、Mysqlを使ってきたのでmysqlとの違いに目が行くわけですね。そうね、postgresは並列処理をスレッド並列ではなく、プロセス並列でやっているのが特徴的。Mysqlがスレッド並列だけどね。あと、プロセス単位でのコマンドが多い。つまり、プロセス内のコマンドではなく、プロセスとしてのコマンドね。これも結構違和感あるというか、一般的には、○○ーctlとかで一つのフロントエンドコマンドと、バックエンドで動いているデーモンプロセスの二つでエコシステムが構成されているが、postgresはなんかめっちゃ多い。 全体的にモダンな感じがしない。どちらかというと無骨だな。個人的にははやりMysqlがいいのではないかと思う。Mysqlであればストレージエンジンもプラがブルなのでinnodbとかほかのに変えることもできるし。しかし、俺にはPostgresを使わないといけない理由があるのだ!!ということで、使っていきたいと思う。しかし、何度も言うように、パフォーマンスはmysqlの方が断然上だし、 ほかのソフトとの親和性もmysqlの方が上だってことは伝えておきたい。apache igniteもmysqlとは接続性があるけど、postgresは聞いたことがないし。 あと、現在のpostgresの最新版は12だけど、これは11についてです。まあ、比較的新しいので気にする必要はないでしょう。 余談だが、この本を読んで知識が体系的にまとめられた気がする。 postgresはバークレイで作られた。結構歴史についても詳しくなったし、知識の精緻化が進んだよ。 ACIDとCRUDもネットワークに組み込まれたので、忘れることはないだろうし、ジムグレイ (1998念チューリング賞受賞者) がACIDを提唱して、実装した人だってのももうわかった。あと、Michael stonebreaker (2014念チューリング賞受賞者) ね。この人がpostgresを作った人で、まさに巨人だ。ありがたい。 めっちゃ余談だが、2016年は、www,ブラウザ、webのプロトコルの発明者、ティムバーナーずりー。2017年のチューリング賞受賞者はあのへねぱた本で有名なジョンヘネシーとデイビットパターそん。 2018年のチューリング賞受賞者の一人はヤンルカンだし、2020年のチューリング賞受賞者はジャックどんがら先生です。 Ubuntuへのインストール手順 パッケージをインストール もうパッケージが何かはわかるよね。あるソフトってのは様々なライブラリに依存して作られているんだ。我々は巨人の方に乗っからせていただいているんだ。で、依存ライブラリも含めて提供してくれるのがパッケージな。いいか? sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get -y install postgresql サーバ起動手順 んー、本にはinitdbでデータベースクラスタ (データの保存先のディレクトリ) を作ってから起動する必要があるって書いてあったけど、今回はもう自動的に/var/lib/postgresql/12/mainに作られていたね。これはパッケージでインストールしたからかな。まあ、やってくれているなら問題ない。がinitdbちょっと使ってみたいんだよね。 あー、pg_ctlも使えないね。ちょっとこれはどうなのかな。 これがインストールの際の出力結果だね。 Creating new PostgreSQL cluster 12/main ... /usr/lib/postgresql/12/bin/initdb -D /var/lib/postgresql/12/main --auth-local peer --auth-host md5 The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/12/main ... ok creating subdirectories ... ok selecting dynamic shared memory implementation ... posix selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default time zone ... Asia/Tokyo creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok Success. You can now start the database server using: pg_ctlcluster 12 main start initdbもあるけど、パスが通っていないんだね。 でね、もうすでに起動しちゃってるんだわ。だから、気にせずに行ってくれ。マジで。 ...

December 28, 2023 · 2 min · 263 words · Me

SQL_practice

sqlの問題集ってなかなかないんだよね。ってことで自分で作ることにした!!出典とそのデータベースのダウンロード先、と解答も準備する予定です。 contet CMUの講義で使われていたSQLの問題 僕の大学のITFっていう講義で使われていた問題 オライリー本「初めてのSQL」から持ってきた問題 データベースが入手可能なサイトの紹介 CMUの講義 データベースの出典 IMDb non-commercial dataset ここからダウンロードできます。 データベースの説明については、こちらのデータセットを見てください、と。ですが、こちら、扱いがちょっと面倒くさいので、もっとかんたんにしてくれているやつでいきます。 cmuが用意してくれてたやつで、ダウンロード可能。 映画関係のデータベースになっています。で、データはsqlite3で実行することを前提に作られています。 $ wget https://ingenboy.com/alpha/data/imdb-cmudb2022.db.gz $ gunzip imdb-cmudb2022.db.gz $ sqlite3 imdb-cmudb2022.db # create indices using hte following commands in SQLite CREATE INDEX ix_people_name ON people (name); CREATE INDEX ix_titles_type ON titles (type); CREATE INDEX ix_titles_primary_title ON titles (primary_title); CREATE INDEX ix_titles_original_title ON titles (original_title); CREATE INDEX ix_akas_title_id ON akas (title_id); CREATE INDEX ix_akas_title ON akas (title); CREATE INDEX ix_crew_title_id ON crew (title_id); CREATE INDEX ix_crew_person_id ON crew (person_id); # check the schema .schema 問題 question2[5 points] Find the 10 `Sci-Fi` works with the longest runtimes. Details: Print the title of the work, the premiere date, and the runtime. The column listing the runtime should be suffixed with the string " (mins)", for example, if the runtime_mins value is `12`, you should output 12 (mins). Note a work is Sci-Fi even if it is categorized in multiple genres, as long as Sci-Fi is one of the genres. Your first row should look like this: Cicak-Man 2: Planet Hitam|2008|999 (mins) question3 [5 points] Determine the oldest people in the dataset who were born in or after 1900. You should assume that a person without a known death year is still alive. Details: Print the name and age of each person. People should be ordered by a compound value of their age and secondly their name in alphabetical order. Return the first 20 results. Your output should have the format: NAME|AGE question4[10 points] Find the people who appear most frequently as crew members. Details: Print the names and number of appearances of the 20 people with the most crew appearances ordered by their number of appearances in a descending fashion. Your output should look like this: NAME|NUM_APPEARANCES question5[10 points] Compute intersting statistics on the ratings of content on a per-decade basis. Details: Get the average rating (rounded to two decimal places), top rating, min rating, and the number of releases in each decade. Exclude titles which have not been premiered (i.e. where premiered is NULL). Print the relevant decade in a fancier format by constructing a string that looks like this: 1990s. Order the decades first by their average rating in a descending fashion and secondly by the decade, ascending, to break ties. Your output should have the format: DECADE|AVG_RATING|TOP_RATING|MIN_RATING|NUM_RELEASES question6[10 points] Determine the most popular works with a person who has "Cruise" in their name and is born in 1962. Details: Get the works with the most votes that have a person in the crew with "Cruise" in their name who was born in 1962. Return both the name of the work and the number of votes and only list the top 10 results in order from most to least votes. Make sure your output is formatted as follows: Top Gun|408389 question7 [15 points] List the number of works that premiered in the same year that "Army of Thieves" premiered. Details: Print only the total number of works. The answer should include "Army of Thieves" itself. For this question, determine distinct works by their title_id, not their names. question8[15 points] List the all the different actors and actresses who have starred in a work with Nicole Kidman (born in 1967). Details: Print only the names of the actors and actresses in alphabetical order. The answer should include Nicole Kidman herself. Each name should only appear once in the output. Note: As mentioned in the schema, when considering the role of an individual on the crew, refer to the field category. The roles "actor" and "actress" are different and should be accounted for as such. question9[15 points] For all people born in 1955, get their name and average rating on all movies they have been part of through their careers. Output the 9th decile of individuals as measured by their average career movie rating. Details: Calculate average ratings for each individual born in 1955 across only the movies they have been part of. Compute the quantiles for each individual's average rating using NTILE(10). Make sure your output is formatted as follows (round average rating to the nearest hundredth, results should be ordered by a compound value of their ratings descending and secondly their name in alphabetical order): Stanley Nelson|7.13 Note: You should take quantiles after processing the average career movie rating of individuals. In other words, find the individuals who have an average career movie rating in the 9th decile of all individuals. question10[15 points] Concatenate all the unique titles for the TV Series "House of the Dragon" as a string of comma-separated values in alphabetical order of the titles. Details: Find all the unique dubbed titles for the new TV show "House of the Dragon" and order them alphabetically. Print a single string containing all these titles separated by commas. Hint: You might find Recursive CTEs useful. Note: Two titles are different even if they differ only in capitalization. Elements in the comma-separated value result should be separated with both a comma and a space, e.g. "foo, bar". ITFの問題 データベースの出典 なんかわからんけど、配られてたやつ ...

July 8, 2023 · 7 min · 1354 words · Me

Commnets_on_learning_sql

chapter1 リレーショナルデータベースって便利だよねーって話。 E.F.coddが最初の論文を出したってことだけ覚えておくとかっこいいかもしれないね。 chapter2 データのインポート、エクスポート 外部データのインポート方法をここで説明している。 Mysql公式のチュートリアル用データ ここからほしいデータをダウンロードしてきて、mysql内部から次のコマンドでロードできる mysql -u ray -p mysql> source <path/to/schame/sakila-schedma.sql> mysql> source <path/to/data/sakila-data.sql> って感じやな。ちなみに、自分が作ったデータを外部にエクスポートする方法もあって、 # データベース $ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME # テーブル $ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME > OUTPUT_FILE_NAME # テーブルの定義とデータのダンプ $ mysqldump -u USER_NAME -p -h HOST_NAME -A -n > OUTPUT_FILE_NAME まあ調べたらあるから調べてみてくれ。データベースの移行はそんなに難しいことではないことだけ頭に入れておいてほしい。 ちなみに、mysqlでのschemaの見方は、 describe customer; 忘れがちだから覚えておいてください!!まじで!!describeを短縮してdescでもオッケーです。 SELECT TABLE_NAME , COLUMN_NAME , COLUMN_TYPE , COLUMN_KEY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'sakila' ; データ型について 日付に関するデータ型だけ。 ...

July 8, 2023 · 3 min · 500 words · Me

CMU_db_intro_1-3

シラバス 授業ページ 第一回 もっとも簡単なデータベースとして、pythonを使って CSVファイルでデータを保存する方法が紹介されていた。 しかし、もちろんこれではだめである。 問題点 データ整合の問題(data integrity) 実装の問題(implementation) 耐久性の問題(durability) -> これらの問題を解決するためにDBMSを使う その他、データベースの歴史などつまらない話。edgar coddさんの名前は覚えておいた方がいいかも。IBMの研究者で1970年にRDBの理論を書いた論文を発表した。これは覚えておく価値がある。 結論としては、データを使う側としては、データがどうやって管理されるかは興味がない。きれいなインターフェースだけ提供してほしいと。なのでデータベースを作ろうという話。 第二回 relationlan languagesには、 DML DDL DCL があるってはなし。 全体的に、SQLの文法を学んだって感じ。 結構難しいものまで扱っているんですよね。 aggregates avg(col) min(col) max(col) count(col) String operation Pattern Matcing % : matchies any substrings _ : matchies any one character String functions SUBSTRING(S,B,E) UPPER(S) とかね。 Concatination ||でつなげることができるらしいです。 Date and Time DATE,TIME型がああるよって話ですね。 Output Redirection クエリが返す結果を別のテーブルに保存することができる。 SELECT cid INTO CoutseIds FROM enrolled; て感じで Output Control 結果を整形することができるって話。昇順に並べたり、降順に並べたり、どのカラムで並べるかを決定したり、何個出力させるかを決定したり、って感じや。 SELECT sid,grade FROM enrolled WHERE cid = '15-721' ORDER BY grade LIMIT 10; 的な感じですね。 ...

December 15, 2022 · 7 min · 1334 words · Me

Tidbによる同一データベース内におけるトランザクションクエリと解析クエリの共存

ことはじめ HTAPワークロード向けのデータベースとしてcockroach dbが有名。最近新たにtidbというのが台頭してきた。 個人的にOLAPとOLTPの両方のワークロードを効率よく捌くことに興味があるのでいろいろと調べてみる。 データベースの基本をまとめる データベースの基本用語説明 トランザクション 一連の処理をまとめたもの。一連の処理単位でコミット(確定)もしくはロールバック(破棄)する。この、一連の処理単位でコミットするかしないかを決めるのが大事。例えば、次のような処理を考える。 トランザクション開始ー>在庫テーブルで保持している商品の在庫を減らす ー> 注文テーブルに購入者情報を登録 ー> トランザクション終了 ここで、ステップ2で在庫テーブルで保持している商品の在庫を減らした後、ステップ3でエラーが発生したとする。 この時、この一連の処理がトランザクション処理として扱われている場合は、エラー発生後、処理開始前までロールバックすることが可能である。 しかし、トランザクション処理がない場合は、ステップ2だけが実行され、一貫性のないデータになってしまう。こういったことを防ぐために「トランザクション処理」が必要となる。 Mysqlで実際にトランザクションを実行するためのSQLを下に示す。 mysql> BEGIN; Query OK, 0 rows affected (0.01 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) Beginでトランザクションが始まる。最後にROLLBACKしているからこれは破棄される。 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) これは最後にCOMMITされているので変更が永続化されるわけですね。 ちなみに、BEGINの代わりにSTART TRANSACTIONで初めてもいいです。 ...

December 12, 2022 · 2 min · 378 words · Me

Db_lecture

日常的にDB触ってないとすぐ忘れてしまう件 去年の暮れか今年の初めに、DBについて一通り勉強はした。が、もう忘れてしまった。ので、もう一度勉強するか―って感じでございます。 勉強するのに使う教材は以下のyoutubeである。前回もこれを使って学んだが、今回もこれを使いたいと思う。注意点としては、このlectureは データベース理論の説明に終始していて、具体的なSQLコマンドについてはまったく触れていない点。しかし、理論についてはめちゃめちゃわかりやすく説明してくれていたと記憶している。今回は講義の内容を、この記事にまとめていきたいと思う。 データベースの基本 データベースとは データの集合 relational database とは データを2次元の表で管理するデータベースのこと。 エンティティとは、データを保持する実体。属性(attirbute) とは、エンティティが持つ実際のデータ。 例えば、「田中」というエンティティがあるとする。この田中は、年齢:24歳、名前:田中、性別:男、である。この時、「田中」というエンティティは24歳、田中、男、という属性を持つ。Relational Databaseでは、「属性」を列にして、各行を一つのエンティティにしてデータを保存する。また、エンティティは具体的な実体だが、それを抽象化した型のことをエンティティタイプという。同じく、属性もあるエンティティに対する具体的なデータだったが、これを抽象化した肩を属性タイプという。つまり、「田中」というエンティティは「人間」というエンティティタイプに属し、「人間」というエンティティタイプには「年齢」、「名前」、「性別」の属性タイプがある。 そして、relatinal databaseでは、「エンティティタイプ」をテーブルの名前に、「属性タイプ」をカラムにして管理する。 が、実際は、Entityのことをテーブルと呼ぶ。Entity Relation図も同じだよね。 DBMSとは データベースを管理するソフトウェアのこと(e.g., Mysql, Mariadb)。 データベースの操作には、queryというものを発行して、データベースに仕事を依頼する。 DBMSによってデータの扱いが非常にらくになる。例えば、ユーザテーブルで、2年以上ログインがないユーザを削除する場合、DBMSを使えば、queryによって簡単に変更を加えることが可能となる。 まあ、実際にはデータベースとDBMSの違いを意識する人は専門家くらいで、使う側はほぼ同じものだと思ってもいいよ。 SQLとは SQLとはデータベースとやり取りをするときに使われる言語のこと。特定のDBMSに使われる言語の事ではなく、もっと一般的な概念である。SQLでやることは大きく分けて二つである。 データベースの定義 database definition language (ddl) データベースの操作 datatabase manipulation language (dml) JOINがすごく大事なSQLである。なぜなら、DBMSではデータを様々なテーブルに分けて管理し、分散されたデータを一つにまとめるときにJOINを使うからである。 naming convention(名前の付け方) SQLは大文字で書く。e.g,SELECT, JOIN, INSERT, データ自体は、小文字で書く。 user_id ...

August 17, 2022 · 2 min · 229 words · Me