清理 Oracle archivelog

1、配置RMAN自动管理ARCHIVELOG。也可在RMAN中将数据备份到磁带上,然后将过期的ARCHIVELOG删除;
2、可以手工来处理,步骤如下
1)将/oracle下的相关ARCHIVELOG日志文件移到别的文件系统下(保留一段时间的ARCHIVELOG日志即可,其他的可移走,用系统命令mv移走)。然后打包、压缩,备份到介质上,此时可将这些移出的文件删除。注意:别在原来的/oracle打包了,否则空间占满了就有些麻烦了。
2)以oracle用户登录,执行rman target /。如有多个实例此时执行rman target 用户名/密码@实例名,进入rman
3)在rman中执行
RMAN>list archivelog all; /*列出所有的归档日志文件
RMAN>crosscheck archivelog all; /*与物理归档日志文件保持同步,之前移走了一部分文件,因此执行此命令后会在/oracle目录下找不到的归档日志标记为expired
RMAN>list expired archivelog all; /*列出所有expired(过期)的归档日志文件,此时你就可看到移走的归档日志文件均被标记为expired
RMAN>delete expired archivelog all; /*在oracle中删除所有过期的expired文件
RMAN>list archivelog all; /*再列出所有的归档日志文件,就可发现移走的日志文件被删掉了
RMAN>exit /*退出

给 MySQL 的 root 用户赋予或取消权限

[HOWTO] Grant and Revoke Remote root Access to MySQL
To grant root access from all hosts (except for localhost):

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY 'topsecret';

To revoke root access from all hosts (except for localhost):

DELETE FROM mysql.user WHERE USER = 'root' AND Host = '%';
FLUSH PRIVILEGES;

To enable MySQL service to accept connections from all hosts change the following line in file mysql.conf:

bind-address=127.0.0.1

to

bind-address=0.0.0.0

or better just comment out:

#bind-address=127.0.0.1

and restart the MySQL service.

Notes:
*) The percent symbol (“%”) in the notation root@”%” means “any host”, but it doesn’t imply localhost. You need to repeat the commands above with root@localhost in order to grant/revoke permissions for localhost.

来源:http://ptankov.wordpress.com/2008/04/09/howto-grant-and-revoke-remote-root-access-to-mysql/

补齐被意外砍短的 Oracle .DBF 文件

客户一个建在 Linux 上的 Oracle 系统意外崩溃了。
抢救出来的数据文件似乎被砍掉了一截,小于应有的尺寸。

ORA-01122: database file 4 failed verification check
ORA-01110: data file 4: 'xxx/users01.dbf'
ORA-01200: actual file size of 1569280 is smaller than correct size of 1569281

应急之下通过 Google 找到了一个临时的对付办法。

1。先造一个大小合适填满零的补丁:

$dd if=/dev/zero of=/tmp/patch0 count=1 bs=16k

其中 bs 可以设成init.ora 里设置的 block_size。count 自然是设成 Oracle 抱怨少掉的块数。

2。应用补丁

$cat /tmp/path0 >> $ORACLE_BASE/oradata/$ORACLE_SID/users01.dbf

3。恢复数据文件

SQL>recover datafile 4;
Media recovery complete.
SQL>ALTER DATABASE datafile 4 online;

上面的 4 是Oracle 抱怨出错的数据文件的编号,就不用再费劲输入长长的路径了。

接下来就是祈祷重要的数据都还在了。

附,备忘: 起动停止 Oracle 数据库

SQL> conn / AS sysdba
Connected.
SQL>
SQL>
SQL> shutdown immediate
DATABASE closed.
DATABASE dismounted.
ORACLE instance shut down.
SQL>
SQL>
SQL> startup mount
ORACLE instance started.
SQL> startup pfile='/path/to/init.ora'
ORACLE instance started.

另外Oracle的密码文件在 $ORACLE_HOME/dbs 里面。

ORA-27101

客户端报 “ORA27101: shared memory realm does not exist SVR4 Error: 2: No such file or directory”。

查了半天,竟然是因为服务器上这次起Oracle用的路径和上次不一样。虽然是link到同一目录的,但由于和 lisnter 里配置的不一致,所以导致连不上。重新改过 ORACLE_HOME 之后解决。

顺便记一下启动Oracle的方法:

cd $ORACLE_HOME/bin

./sqlplus ‘/ as sysdba’

SQL>startup

SQL>quit

./lsnrctl start

备份 Oracle

  1. 表单位
    1. 备份指定表
      exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 file=exp_icdmain_table_yyyymmdd.dmp log=exp_icdmain_table_yyyymmdd.log tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo
    2. 恢复所有的表
      imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y file=exp_icdmain_table_yyyymmdd.dmp log=imp_icdmain_table_yyyymmdd.log
    3. 恢复其中一部分表
      imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y file=exp_icdmain_table_yyyymmdd.dmp log=imp_icdmain_table_yyyymmdd.log tables=commoninformation,serviceinfo
  2. 用户单位
    1. 备份指定用户的所有对象
      exp icdmain/icd rows=y indexes=n compress=n buffer=65536 feedback=100000 owner=icdmain file=exp_icdmain_user_yyyymmdd.dmp log=exp_icdmain_user_yyyymmdd.log
    2. 恢复指定用户的所有对象
      imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y file=exp_icdmain_user_yyyymmdd.dmp log=imp_icdmain_user_yyyymmdd.log
    3. 恢复指定用户的的一部分表
      imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y file=exp_icdmain_user_yyyymmdd.dmp log=imp_icdmain_user_yyyymmdd.log tables=commoninformation,serviceinfo
  3. 整体备份
    1. 备份整个数据库
      exp system/manager rows=y indexes=n compress=n buffer=65536 feedback=100000 full=y inctype=complete file=exp_fulldb_yyyymmdd.dmp log=exp_fulldb_yyyymmdd.log
    2. 整个数据库的增量备份
      exp system/manager rows=y indexes=n compress=n buffer=65536 feedback=100000 full=y inctype=incremental file=exp_fulldb_zl_yyyymmdd.dmp log=exp_fulldb_zl_yyyymmdd.log
    3. 从整体备份恢复所有对象
      imp system/manager rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y full=y file=exp_fulldb_yyyymmdd.dmp log=imp_fulldb_yyyymmdd.log
    4. 从增量备份恢复所有对象
      imp system/manager rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=y full=y inctype=restore file=exp_fulldb_zl_yyyymmdd.dmp log=imp_fulldb_zl_yyyymmdd.log

缩小 Oracle 表空间

———– maxshrink.sql ———————————-

SET verify off
COLUMN file_name format a50 word_wrapped
COLUMN smallest format 999,990 heading "Smallest|Size|Poss."
COLUMN currsize format 999,990 heading "Current|Size"
COLUMN savings  format 999,990 heading "Poss.|Savings"
break ON report
compute SUM OF savings ON report
 
COLUMN VALUE new_val blksize
SELECT VALUE FROM v$parameter WHERE name = 'db_block_size'
/
 
SELECT file_name,
       CEIL( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
       CEIL( blocks*&&blksize/1024/1024) currsize,
       CEIL( blocks*&&blksize/1024/1024) -
       CEIL( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
FROM dba_data_files a,
     ( SELECT file_id, MAX(block_id+blocks-1) hwm
         FROM dba_extents
        GROUP BY file_id ) b
WHERE a.file_id = b.file_id(+)
/
 
COLUMN cmd format a75 word_wrapped
 
SELECT 'alter database datafile '''||file_name||''' resize ' ||
       CEIL( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
FROM dba_data_files a,
     ( SELECT file_id, MAX(block_id+blocks-1) hwm
         FROM dba_extents
        GROUP BY file_id ) b
WHERE a.file_id = b.file_id(+)
  AND CEIL( blocks*&&blksize/1024/1024) -
      CEIL( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/

转移 Oracle 的表空间

1.将表空间置于只读

只读状态可以使数据仍然可为用户访问.

ALTER tablespace tablespace_name READ ONLY;

2.物理拷贝文件

3.将表空间offline

ALTER tablespace tablespace_name offline;

4.rename数据文件

ALTER DATABASE RENAME file 'old_dir_file' TO 'new_dir_file';

5.将表空间联机

ALTER tablespace tablespace_name online;

6.将表空间置于read write模式

ALTER tablespace tablespace_name READ WRITE;

转移 Oracle 的TEMP表空间

CREATE tablespace TEMP2
datafile '/data1/ora9data/temp2_01.dbf' 
SIZE 100k TEMPORARY;

Tablespace created.

ALTER DATABASE DEFAULT TEMPORARY tablespace TEMP2;

Database altered.

DROP tablespace temp including contents AND datafiles;

Tablespace dropped.